From 247bcb145567ba7537b08fab2e4acb7af29c1d7c Mon Sep 17 00:00:00 2001 From: Theo Satabin Date: Fri, 17 Mar 2023 13:00:59 +0100 Subject: [PATCH] =?UTF-8?q?D=C3=A9codage=20d'une=20tuile=20vecteur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Comme pour le raster, il est possible de récupérer le contenu d'une tuile vecteur décodé. On obtient alors un dictionnaire au format GeoJSON Pour mieux gérer le cas où la tuile voulue appartient à une dalle qui n'existe pas, la fonction de lecture d'un fichier ou objet émet une exception FileNotFoundError. Dans la lecture de utile, on sort une donnée nulle et non une exception. --- CHANGELOG.md | 22 +++----- pyproject.toml | 3 +- src/rok4/Pyramid.py | 49 +++++++++++++++++- src/rok4/Storage.py | 15 ++++++ tests/fixtures/TIFF_PBF_MVT.json | 23 ++++++++ .../fixtures/TIFF_PBF_MVT/DATA/4/00/00/21.tif | Bin 0 -> 124838 bytes tests/test_Pyramid.py | 35 +++++++++++-- tests/test_Storage.py | 2 +- 8 files changed, 128 insertions(+), 21 deletions(-) create mode 100644 tests/fixtures/TIFF_PBF_MVT.json create mode 100644 tests/fixtures/TIFF_PBF_MVT/DATA/4/00/00/21.tif diff --git a/CHANGELOG.md b/CHANGELOG.md index 28188cb..f8ecadd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,27 +1,21 @@ ## Summary - +Fonction de lecture d'une tuile vecteur décodée. ## Changelog ### [Added] -* Level - * Fonction de test d'une tuile `is_in_limits` : ses indices sont ils dans les limites du niveau ? * Pyramid - * La lecture d'une tuile vérifie avant que les indices sont bien dans les limites du niveau - * Les exceptions levées lors du décodage de la tuile raster emettent une exception `FormatError` - * `get_tile_indices` accepte en entrée un système de coordonnées : c'est celui des coordonnées fournies et permet de faire une reprojection si celui ci n'est pas le même que celui des données dans la pyramide -* Utils - * Meilleure gestion de reprojection par `reproject_bbox` : on détecte des systèmes identiques en entrée ou quand seul l'ordre des axes changent, pour éviter le calcul - * Ajout de la fonction de reprojection d'un point `reproject_point` : on détecte des systèmes identiques en entrée ou quand seul l'ordre des axes changent, pour éviter le calcul - + * Décodage d'une tuile vecteur avec `get_tile_data_vector` (le pendant vecteur de `get_tile_data_raster`) : le résultat est un "dictionnaire GeoJSON", et les coordonnées sont en relatif à la tuile (souvent entre 0 et 4096) + ### [Changed] -* Utils : - * `bbox_to_geometry` : on ne fournit plus de système de coordonnées, la fonction se content de créer la géométrie OGR à partir de la bbox, avec éventuellement une densification en points des bords -* Pyramid : - * Renommage de fonction : `update_limits` -> `set_limits_from_bbox`. Le but est d'être plus explicite sur le fonctionnement de la fonction (on écrase les limites, on ne les met pas juste à jour par union avec la bbox fournie) +* Storage + * La lecture d'un fichier ou objet qui n'existe pas émet toujours une exception `FileNotFoundError` +* Pyramid + * Si la tuile que l'on veut lire est dans une dalle qui n'existe pas, on retourne `None` + |7}VLmo@q z?jFW|Vuu#CV$B>IP_}Za=#OJa?{g=;dg3|BnN&CN`>^s(FL0j@L9|9j5`3Hwj=U_x4sN&B&2-gsYyAASV)=1M(|t zXrS;#Y1S_}=MH0UuxLVOvNZ5I^Qtu1BquST?#F*t%Hk@9{A6~^BxatiuZSy){J!@g zx0322q7-(L0QR@uyoJ;60$2!l;LcdJCY7q@#yW5F96yOKgcp7;>CCO^A|8YHvE-~uT#~_4OQZB3 z$T`sMj2K;rBG*9|J(aH|vGCsKUjzC1#kx}~Pda5%4YNC@sqPSaD`kSO2JcNj7~JU3 z_s;LW&E@|(qyQmM&gauUSNH+p$Y-mQuGKYSehz}7h0ZvupKsL2rYV(k<0Zm}QF$b) z%Rf>J>bXtnNp1&EIB`5Cpo9pG<8;*eTExi|=MN-z;Z2>WvJbFaF_CHw;HJUzblS)D z0oLF`m&pzxJ%{0yI10mvb%@Yun(dTIg>1GuA?k7pFly}gac~}1%6wEv%g9sDYm8kE zbq2HPF`lt8o6Q}Vpc{-c#xon?taE^uRMYz*DjH_X72{v-RQ>GeUO8C}U5o9jufHi5RBV7A0{l83}b4dkPz?1n1kd#OVyysx#Evl0Y!0A9D&=7c2 zQiy~H$(xpIFcTsZobCEj;%3-NZ<-_*XhFU!JV5v}a(FIOhrvbvp58pC#pwkQj(7|n z3A~Q!H+xalSH3`Ydy%wzJ~vz!GDu*&Muu{?v&|%i@GgnO=&76vUfuRcdX9Lwu!jSb zEMtX`@D~!l?LFv~NisIJBcBjr)mOrsPQT0|fE0E<6DpiK+)b_za3BllBu2-yGI>$t zw91i`m8*&wmom|nwv;U@=^a`cWK9E zJfPylKs;L`vr%%_Z-`yuv=E;+8E2RQc<|DEGKS=CTfX>h7t0Touzqjbdpc)ea}nf# zv;iE1qu@~0`;&4fi7+Hj0S-q37X?0w#jq1(E9sk1Bp!Z{rJpA-5OWw%!+Ny8n1lS4PKxA zE&*0xV^HG-W#|k2rg1A)6ovJk(VGW zNv9agvO+1GCBVn>g3(`tycidW3{`OY?Ott0%zuKrrI8kK2gYILZs*x80hcua_oCq6 zItL#1oK5ogrbj>%s;A-5Q%l}Eu(Tm>eW}nxBq+%Cp0|cj-)>Tq2>| zpqg`O_iALGpD1T2`y*-j?_+&rqJ#KrN(bh@lz+@v|>gdYD7e^LPNPNi?UFoj;}*4-f{< z>9QEAMTG$~ktvIL@HxcFV#tM%yA&o?ErP?$NfHNu^f@N@k+E)`4D&OJMM}bB-|xMQ z>@hJTSf=||?%{k5!bgSIIf|G?jd~CX8{Ua|>GdoH1sx{O1<*8@^9J|L?kKYcpmNTg zI~C%8S;gp=Pe?>LNR7ObN%$(-Y2-K7Qmy+;wH^x21-JRPyI>Xe0|<#CFDWJn6C4Ln z4$?4^N*TR5riZO|MxqB%a9H^@LeFQIx#N%XvVFmL4FgNj=d9vDNK1muh=ZE+gXBNE zs#V!RS_oeN93f)Xh(Q~NR>a>*5>?n)_GgD6?xQf2;MO_~Av_$)?iD%zmV#H^&feCl z!~??0_r2hq{)6rJwj&c6QwDzULTF2{6$wc?LbsO00@3j`ujSXQj5s(gFqQ&>0uPe$ z#(2fl@2E@*Jka@ayae#|cg*Nwx~0_}IO9mVK%jb6Sob$YFhnW-$PGU`oK4SzsA2%< zRRACmFX63h+Gv^$i}ABi@oYmwqV~uy){Ar_kt#bZ)0G&dSfo>rD1rbuQh-2yL;~im zEE0$>i)Ff#Qx%h-@d1#>mgUJ@w07|KT;*US|C%~)tVHM|4dBBLoM#H*0{$9Ju(@p5BpByEw1AxIf}qdT|vvBiph3C{y)gj|O!hy#(3QJjqUbf=?C&3UMM zJUD?8dcEUZ!Ss!epp70kBxIt8(_#bU0Qrb-W_MI^E!7&RUP2ZK3#8eY?T0+^mar!P zSBB0JEi4IW8h?~x#xD{J@GmZvtb(8m5Tgi?yL19#I{d^+#j}tLY%L3ygPEd^NJsZe z2pOIsZXk-m=;9IRhZq!kACQsmvJ>_UO2~u6!w`NvC9J|4(*y)%-EcP`V;MnB$|ujD z`rLcPe3pmV`;qlBsYDS7A~kCf^OnhSU_S!@*pA4WoY^ljxet-E6v*s$HnonwV8{Qc z8+@(fk@VxKo#Atpg=xotZwIC*StTV_nr#izmg^cs*9+N9OhT1MS3~-q&M>R}k3_*aw3;T0f-a(!9mDiY>QrkIGhF`;}CY)-aUvwg4 z>$aG6UeqEzsX$@npGi9JysPu>G-3c35C@NtM#e}_X$-?SxI0~RY6*%n?{l3s10Wd4SVLw=CBVu?T(ILE zKCU$s9BeB-?MH=`^ZdN~4te&_=53yh7@Bw{dY7J+nI?lCIVMSxA4hHo#6$O%o>@*7-+&4*IBDdiFAwU@ zEGvN@9YL%OL&w9Lz-LYzp~hd0#)b0o`8!x#RNg6w8qa|4(?^MRuUC=~tfGy0dxqrX z0)>#?>fdx}enr}1)mIcA9cj3MtC3EA27WyRR1g8(^3!$aqG*^5B^Po zNIKhqgB>l1z^W)$@@?=H0F_`trn1C+&S)=l$l`E$x3i2mgfF6|0{mz`d>u6ddt>5yO*N3KU3)Xse{zxdv`5O_j&3d^@_;!P+LyVp-pgq28X)ewa0@`EKWAR9zr-^M(Y}+$FZF}1@xqZvFcv{ZNF!$)p_|k^< zj!lnF#MeGu@Ox&@(i)hovm6KCy=7}0?tgOd8?I2@8&AuLf7~-Ov#0X2gv6&$E*w^n zcqyX&%!1^w<@sYr`wkvkSP?mX+Q@nH6{i$YTYAsWE1*u?yt$HQym9FbikqK2e#1$H z)Svv-)5XmdQa^okIk?>lB%e|Ud-pZR4={Zz<{!oT;EIEb%zruF0?+wj z&u12A-?w=9<%@mG=VCF}6({j?3&pqM-Un}5xcWHjZemdrD$g_&|8t76^SUKeZ!{?? z&Wq?eK|%!-0UmoR4ew3;#YV?Q|*|4d`-%z?RN;nYHtES~;s z2E)3g(O7K1xrwWnGCrC_b%Z%66-`Qc5H zb;}U1OoU@kzH85^BMT?5zwQ`$6U#_wceb8W`FZ9h#DRoul;>>w);QH+1QNcS z8o=My)luxmmzqV_Duny#5OR6?05MC2*rt@5gs`o9j$cJ+p71-jAV{&E@a`Z9!3|MqylD5E65va(*i6EuuV6ZpKum z(1b(_IjZHaB4~?_>SPDWp4M{eytC|#$eNCr;2`shWuiozDZm|@NKCHQ%?rjuSd-p? zdk~XLZP#(_VC7oenJ;AZ*X47-h^FdHK3)uSZGw_i0-)@OFg?*`E|AYaW~jLg6gors z;OYI`DR?Nz#MhhAwfhStoX6#WsA#sHu4gBA%&GiOdUavgnW0hL9AzFe++8YRI}n}3 z5SAT?EfwL_kt;6j2d-5LD{zOGuj{Wm4H5!)bXt`~6Jf!hAU}lCwCI4-o^bw%dYbdY zby}&0MLg`z;q0!P!5f=OSpS*e+y0x9L%3CCTjM*3t6{onvfe~9x$A>Uo+b~OskUy9 zYC8EHWG!T(=b3Y7d+XYwUArTAAl!F{%dzI2U&5{k8#3<)u%&X@o>D0@mK)gS)Ym$r zA&pR{$BG?Ye1YwL=u&}}@};jd!_&<*Y_jK`O)`xBtx2`wmRU^Xl*94;q~q+P&mbpZ z?hK(9tqrO;5Ptc;CLi;i2i$gz6>yvp8EoWb6b$#QC>59qA% z*;>CWjx@Gy`@v{MN=i;Y-x~-)b48f(f#IJ3rzlBFrMr2aTmfOwgD1})wMItrTBSwcMEIq9 zT|NgU+8H>kh%ero$Z2a!@g!D5>X4kBI`~ZR3Wt&iZIi@x#U`q_8x%Cjtanoc9P}h& z$E0ttJ;9XCaLP9>%z+Njram|KAWx)P_-$Ur*{oZFNX#QU%I?_o#893|lA}e9?Vb(dlhZsfh9i?z@ylo zMGh)-H@@O~?f16fg3@ipYP~@*?ARG6BTfPDQZbwa{|VMoHqLEeAiP(+9oGjn zGCv@mu_cRdM4jVv=|X9YaA>wr$jNuj&fi6E^w{mpn}KsCdT-O^G_xdE>4J}3eWM$k zOMlnD8$OMXkkyy#xYlC0;vnVK5>sKGP?> zNK;&L1(+=E$ZT~i>@ShmG}~yf`zTG)3Gf@n6}^)HIIZb9X?4x6E7A`fGf~x;_yKp0 zh5kx%ORBeREz_SngS%4?Wq>El2B~l+b|yZjr6zQln()8e;QPt5;hA)8yd3Rh?M0SH zbe_aAIA1+iEXb9PST=W*rAtYu2}W#cI3k+@XOga%D3f`^_N!z2#fY_Zs$%(@(}$Qik=fd{cho@$ZQ2El6Hcp!FEA{^wf6gmwTYW>8b zbPFz6LW05>^Rtt-bL>^FbDNt*ZyC?-bgn=sXQCg*K-gtKIFcMqr2)eF%HMmzxwgBy zVL}d}5r$){0Yl{D*UKRL@1#17FkM!NWb1<}(rH>2BW2hNScz82>Wb z0&xKq|4}0*PykpC$e}s2HUd#_?eN%8FwQ%b5Tk&1V~Si}7Av_1cCe^h+*bfV9qkKC zq7E2sCOC0$RLL+)h{|`r<5q{b3!yF*G85e8zS2Deuwg>v%D|eXG$7f)f=n>GIEAjM zljfko0^Sn6R_$V?0rL3hcVm6%mtp#`j;`d&TIIH6@PW*osXG&_o@u2*?{Rpf>f3YuyjA67nCaBDJaeeg_DscpSF}H<#n+bfldJ%;}U`;>Njsi zV?wbdQIx}1nWZq!lyvxn@+nLH01H6QqJ@y|%gJ9xzz$6+W zbwtQfy1(!|R2G%^69P~O6G+_W{-b+8SrDv>SsGXrf+0H;ohiUX_(NM{%>|17p-$A5 zd)zO%^W3dR(2#;xaSOT_s?qFm3MmCF6t*|HMdCwjmWsg}*ez7k3~)TpFhrbbH5jtK zLV)AZuE)GPl3KWg4X`F+gM7r8A`7Dz%4Z{Z^~Hf`K*T}jC6Az3(pp%Slph_KN;ElC zdN8D&+CVCsfW}H$#E|ITQU?0_8{m*~b>K|AgU~zDQUDQr_=6UB#v6jQ8-Gw#+36|L zGywo*q6w5ond%?aC_G~+HPh|EP>lt9TuFMoz@0NJ#t__hFCo&ew-YbP#c~dC6HR91~y{FR~yny8!dF4gY_jWVUKN)#+qMNmooYF(i&}XaVh1!7 z>F4_Ub(lgWhg8fG>*W`cG=)xgxo=EVxJ8l>cJd+bm8tucJ7_pjq?H861WCyRl|+$Q zDxmXh+Nppl;LWQOA4m?N`IsK9hm?Czln^d__n+?XB<9#7ZAwv{v`0uxyBXVFEMvMz z&we4TV5Ijc{<`ni#hBqtpN|>y3tD(rF}$OF#F?%;5|5JxYt}?mB(nfDtCxsl9R^Sr zDS(352M};b$PaGh=cU~VCerJ~2*8aJz6uChR=2hx(!t*AP9(_=#GpjQV@+x|A$|dq z=vQcz15#Ar70$UOXzo&})G+sPtFuhKQ3bRO&HQy1zYm zB=y}cj2PuTN;fUYwrP~fi2i=+mFb6=AO%wB&=tPS78TpYl2X7>_Kf16DF32hcE_Dk z+304C1m`~CpM~7H5UgoPT~Q7mx2QlBnI-uHn-l(tfeD`hS?P_#qQHk%EQl)r;HV{zqB77Hi8jp~QR>~4Kw;U!t58Vb! z%I@H)Fl&|OL+@&011shV!%l=PTLxIXR5qGcB#dD<5Q%V8)Te_0+kpq(9+3qKp$UGR zC%{$-pjro10@>(e`q`Q|41kNWpj$H(+a?vX#Pie~AMP|Q}uF?FXjGZ0@C%18VvWi9PYlN_}l44y7F$o!+2 zh_LhiXu|K0lwr_=!4Q%YNMdd@qRsLk_6zcG;{3(yz&gD~I*V`tu@6b2ooi(rLUfiuBkbWYp$748v>J{PMhkSbFeQtd6=K}LvOak> z#|MAqd2CG-h7CcB(_7pbumi7!NM)ar`P~eScE5@L(goiMoehA7fOGw4U3gN zOcJGHqV#LhH9z)lL8i+s04v}Su>Pf|3N+tzKj4nyS29dSX_cEJYs!?GEYch74?Xy` zaEteG{cY}9w<4oJ2Z`{!!!_ndV+ijqj~z$>`>gi^?=Wyc%K*7KBNJ9SB@R~wF%RMF z1FGtKqg~yW$QI>B6EFPd^!wXx_r}YUq&rMXt+z}J^59i6R=&`|BMBgfqkY35SUIS} zfuqaIJDjlyM+XP~8`#Ky>2)OMojMzTM|kjzi{%9aQ@Vi_kcfzxAywo^IdS9xU@gzE z3!nq|al}GqIb>Zk9ra5Cw#~f#Hdg${xKnf z;O2GrxKSH|Clj5G^S>@Ke}j~w6#jTRg7Bf>*f^ zP-1Ki03a^ZPL4MkrszQUS^W_8CPRDh06bTwD?fpBw4g`Bk2MBd!ay0~Ftmq=0XzIl z7a576H1PwEC!15Kb&Fe{gHh`ui5j$Mhx#_e;pNxJF2tgX)d-1RC=}KKm1ct4m%O4F znB}G)oMDr|40fZ-%s6^G-C*Vol%ODF!x6F~GQ89yc>fSc#mkg62de*_Tak!|xA0rx zPrM-$D%upsx$}e2Q-nnpeKpqYE^KLrRnrVVO{enq$Gkhi8oWUx$UAg7pjj@D7-QfF zKnGx?MDH?suXq5Tusf7k(2XNeLKWBXd3m@tJSiRk6uDO50#$Wb{7)qmTFeWtfZ@TO z)mT}MdM9d_Q^WWzFcC@vZQ~8bQ3L_M8Xqy5igqo{Ue!vRAgv!rrs2T&xx~wYB6^D% zX43dzaSrW>b-l?Rz=K)iSo=Q9&o+?8J!$(JLO)E?E`3Axt zb-w^#G6t;4%CX$QDfb((!t;DHtwkgmOzZWP?}Wi?+s|~6>;u!{K+^q1MxGM507>@W z=}KqPSN65#u}Khvh4>f5eGSb)sL9D9ss`6#x9pfg_CNxr1LWvF7JSnE+r%TQO<66Y zbI^-CDpNNDaA*dN;{qZVWf{J6fZC6_svDNWP4 z>yO2BxQI(2UT#*sT0JJMvdIW&iie3vU{R#|3kCXhoPs-sq7+nqLU(~*vM!z@Xd>I8 z53;`csmzl;t54++0UC%{e#=g)=F{0s+d7(=WOL{Ul3P>CHMV#axyM*$_`Jm`(ACIA zfE1vDb1baPfheE^D5U8*epP-( z1;EsJi3>=ztRjpEgb8}0arphs-T=PxMol|H(+f*n zl*43^52h?LyFr6(i>!%_1928lRf{%6rm8g672xFT=#>7JIwaiw@w4`j!)JJ$CSo;`n`;-XKf}LqO4+vW+?zW@`iy6cBDNdk~1It z(+Z@ovslO;z(D1>gNJ|=P>z`w5h$P{_Kqp{C2vXs90n(}vWcgvTte@24GR5~bxJ@aYQU(u^YZ6uG$AZYk^Z6%<}!ZYjE@d}!>_#fCGSB$ z!|e%*aui04eCphE2sEuqG6ccB zenF}Y--mxiZ&yFv<>DH?(>p^wLK zol+Xgf7>S)0Gz#K+B5RIM<$$b87_YbtAeDj1&m0hG zrqFbiatN@UP6#FBr*i!ZRYkt+W&OOY&dgBnIh{TAdc8E(-bGrYkLV??YK!j{=8 z%w;#AARNUaF(9R$BC!BUuol&%KIqtmTH-Xl{sadcm2Fw{+c$dP@g0 zPF+U@0wa4+y2X{HLF=f+Qz+npwZ>deK1EruVv{l_;I%SCe7XhLIT~P`O@4kS`yECf zVlTh~i?Ehf)bZTMiwiZKd!+T6605Du1yI{*uBcoRc3u^Lg7Ftf-f;VV9+r!nY; z&bi-wKwI6$Qk=54Z3A)2t#}hZ3XZZn3_jf@R#KS27pzz|hO=BUobEIYR%N-sN1Iz$o;QYr4G%N-!o#9vs9G}}yY^T*tocF`I*?rer2gAUr*y>wONwaFR1 z{{OgB-Po^cY@njdPDa=K%Fa0ehMPis*3gb^(Y1rPze3e1fkKj=D@L{i$Se21$YTr30am#?cT=|@+CVG}#Hru+a z&n~OO8@}sL#Z1y1IY3nk*Jz}+imRyx1JH5fZxvQI(uJj8T(of^6WtegMkNVz&&UU`9r@(tq!RcRFLkJ zxWgywjH2hPaw!ehrkQ3h2kZFSK`J~F1?)Ep`Yck1Pq8}I6Qp_o%mI7VC9PMr*{i_P z2fMBb+s1p#HEQ~lfD~mZ1jK2Y{Bzt&UuEq4L+;nyxitgP*f0`BDCCzJ8p1@@FU2v4 z-7Pmy!rVNcaD&I%9_+fG=%@ni=(gs*B#fJuNK*X~#yI*x3892$iOPezQZrP}XL?^m zUtdy5z;}d*6e@1V@S#zIqwYIW%H?N7hJnQ#W?4uBYrD_AjW~&PY>uq`;yDh?5Z4SI zWM7In_z+$qCP7H-8{aAOTIo|%Pq8q7C>K;SG2@Ds4zR{_fX?6_g1fqlJ{@;;b~6Uh zJ+17GcFW$_6udU%BIP5r!=tb0M;Vc-3_-B0AGoK7z%FzXWHm4PqnN#3-g;BP-gIY@ zVs5kzAON@|CS+x@La{cdL7o&a(FodNO;)JLY zu||Za6>qJy5tbx&$}7ZyKDp*Mt{MJ1F-q@_cH{J@n`Tqw*3o5>`Qw#y3ng^TP! zcmTJe{x=d=hs%;sNKR{5@)Ai`1fX3;!Db;$!e; z7$2~hd^yBj!7I7ca-48k0HQLC_@iVkpb8-6cFagQ1PWZK*GfAW_Zb>vOoBeapYRT` zW~_OghOA}0?$RG+N8RZunTcJ&$tFe>ah871!WxlQoK^G^QWIG)%aJuO;Eh0b%WAPh>pPUX40?jyEjuDL>@{>8kie*A@ipXj# z2e4<@Ac7JcL&i>BHjq>?SptAgCmZ94iBVQqj<8~7B#Dv#C-cbWz-S=>yF@ap%Rg5+ z(Ga$*kO%Z5Lh!%clfVe{BMTQ+3c1otnH%*Q-b=7FxCXKpJ|d%0EEK|!4re5Ize zb%*H+LT-J<`(JTniY3MtkKwww-cd|Tu$TjTyIYk%PP`!)%T@#*DczPlLwjsAnjgC4 z1gR$udhHMJ#SV#bb+g1^WPB6U$CvJcUFJ39BtIDQ&x>39Q*vZ|XFXJ)g;(l zDo{;ZHLor=V>AY%1-Y4_iR2{+0bRh}i5-c&g=6x$nBvI0rBZM)UNOE0$s>Xe3V#<- z;pGZ&hWJRXY`i+mI;@QbJ)+`8P(c4f)m z)@{uWv=hrMYNu)Vx>Rd8JxROUEs6$JSCss%DDK-eJwCoQF8SNF+<|swMc;B6-=2}> zdOZ5&PEXr&e|qKJIK5=!ZnY~b?{=*yxBF=|c6;{jorp^bpHObMd+X#D1;zJtrK|JfUk{=X=28VyILuWjsGxMtxbt#ubEe7g49 zB{XOi3mH_GD~VJT^+e!n->s`RtpGvXd-dq)6UQq5zp8KYDqdfLKgsCxu?E`fR_UKN zncP5YtRS7J{Bbha`P$@}wqXQI4Y`+Q^a~ntodJ{fL z#1IZ!1^tlC@`qsx;7P&@WaTv$u91X6(uBD>HkoPh2xIaCQ5|@i)O#eid0|i|5o`q5 z^gU7zp@brWU!aHbs%%FRan~wJLFu#m$ZF-`Xb`V*XVCljIZva*D5zp`WP;~9Q>dma zQDFmVG;-!_myZV>BK;@HhZ1d_-*)L}#quzm5t&34v-#49>95Qf!qaE1G~{_|*0->X zGMSxEQ{O_$;%pKJjq@4Y{CJp9hF3Yxj$~4Lv>&v$JF{~vqeHn)scv_z$zbLUaV2Xy z@JndFaY;t`9N7q)fu7ZF+>-dZ(%zEmYwcYqJo2K@szx3e>_Ail8byRvjCzcLus}u` z?ht$l>YOJ}0|NwrR;VJYTz#`YfJT?2+9CKcl?g-RBPzTgl@kT$PVcMkP=UcuTmj%T zhv8#xRLcvP|KYyf!!qOz_}#8CvuGTADkrulE4YzRM=F=0A$>1(zo$?_)^ciWMVy5& zhX=AQX&Rip^bYf;rF}p)opfla5DX@3ZIem_0J&JRsh!RCwj1qTQ^|FycHWhtz3sr? zCFyXJ>5#Yfr({(sI?TDn8lf~*DT=~$P-Y^mrUnwug?4Jw_IEp`6q_8gO^&$}OPi$i z5u02W4EzNJO=)%iajxRL@Y_p=C8VBYFO*ls3g2*R!QHmtvu?2O{mj_sl*Tf~Q_C}WRjNfkC-^&#)& zqfT3OHDA$ZR?6rn-Ts;VQ6ZmA6+5{KILP++CXH7|{qRD7f^|R{16hZ79ms|wu(BPu zt`u?lSMp%KnwJ+$)oZUXkc=8gbQXC)lBpc$EP~q;gI!1a)buGoCqGMo%@(Tw4Cs~#KH*L9kznuv7t2atHe0inHuQ5 zks(-OOj#-`F|kThvTN*6z+WXK{;B(0-s9~m^HjFbN`I}mSs5jK7=ng=!t!SR73$$y zWY7!4pt>EWiv+$fJ=i}&f~-tNcqaZl5{T92kEntvSZ{cD16vXoAhY}om0d6J$#E)O`UNR@fMgT$lo=dznZOke=m%ecZ z$BK4|GYWvgf-=E>#bdd`kDhyjJ0$P*7Jxu!;b7H~p$?6_;k;Co(vfO;+2 zb!kQnfZ&=Q9flkBxUKF8@?8AaZ(9RvS`++!I8X`J0`49)L}n-qp9W6S%(#~s_Rhu;a~8?(OS*ij(@o{qXM)YIch9&u^FSujSmU}q!Bz*}Loj+X zJ_9_h-;R0SQ0on$y@AGTr7tAUB{+1^!%_eNkcq-z?-naGT$AXQjsc5SToHDVrv};V zT45FlTB4{&uLT=fD3~Idu3+d-4MenGKn>>X>ZgezhUdT8Td^z#EkY#e(P(umJ090yxRtEjP;XOp?M}Xz2x42i)N<@@6%ov`p#{Q*Etph9Afqk0h zZNb1J?S3-b%Op$2>hNr(zVJ`KrZz$9YEGNW7Dh>9ZYYtKCs>@0?{oBO z216(q=1y&vbrD75K@d0zC(?5oh9Ur5Nlx6OM^nVrBf?g8xMT|~4_HRdd_POnj41F3 z=Lw3GIa;)ECCk!KGeUIfN>c$z)#N>5uyQ*|PMD0;(fz+PWtJeJ|>Z`a5>nbUa;h`609>8%sU9;Wsj^25|r?~*+m#xK#0s) zq@}p)O;?;B7z%EjotG?>wfE4h^M2C#~)myOWFj(xSUZ(4Qml0FdVGu6L5^zBA z#gCgSZj9(R0DzbdSsJd^3*-CumFk5ePTl+{N$6oin?l@WqHo23>u){0%O3uDm&v^! zPT!eQ{UDl*8V++@vUaeO1h%M9&QA7|OJ-SE+2a24D@iz}s-1A2)Nw?wWyw?tEs++_ z-#g@aB-u`F|x@&v{WC@~f&D2FgqGie5DnQ~{Wn8t>< zV&M;{{{ND=-+fX{?8C{;=mXeI(aQ{mgYK3kd~z8zoT(fR?(sfIpGo)){TS6XlDy4Y zp%&z4$8AL{QC>|{H9FoJq_vfyT1ywKaAQ8rD6Z-0=Jc%b>6zx_ zsuj-7$+6wzBXJY6$?@GIO9QXAPwt%_iQ9B--?f`Jn`?6Wo;|y_#q+nO_w1cs`gCSw z*TmAbGh?hgc4O|^K0UrQZXosqN9eBI0q9x@|n%u;gp3KyNS^i>k<}v7-!M0MYSoqZt*yOHy=&c ztLJdfDJEVWyY6`7*p0_dUUl-=vE`vVYBzQAc;CefCtkA9nt*i@&t2;gPq?Dl{^ki+ z&~XWW-i-^_()`I<7CqG_xyU?oyN?+hj-Gt^Q>=!Ie!An5-c8TGdI7)K!pX+$@soW# z3TNSw<3~>~o<7xDHdmRSlu2667e2*Rba>iz_0@|vEHo}%xa#`TPxmk`Te>b(Z^E;9^1L}-^ozQ5;pBA-M;H2@573UW{HNRkE>#ebJ8flDo|o^V`T8#@c1;k7OF(3#!5Nb@r-_sOW#^wc&X{@kY5 z_bE4r>-DKuEcAUcXf;cUmU36OCVw?I_|%sVhnt$?zn0GbC$EO2jF2mIi%!FGcCOLT=aWx@wZiF&NUw zX=YLfyDvM8Uc(%fVfw|GZep4$9V%K5krDGpJS*8tVQ?{Bz#;OT#A``Pr8ZfP2>(q> ziKwIz4as^51NF)#JgRt|9Dk)P=!eRZi`J8qfh0r|e1nJaD5pj6koWuYCQ`LbL3PyY zlaDmJfU>GUaoi(l6Md)SZFb-gSzFl=e4umSjGJK=b-+Yo(|Q$~&#hXo+%Z*ap<=MP z4`>4Q+Q8X@nfZtO>?WC-jm7wmSg+aGdTy6J_g2Pmw`a~IF?C}n!-}c*!&Zzd6Aa8-lBMupy30MK7)Nv!4XRm{zg`vXknff4S0Tu!3k^GqEQ^5nc9nBn_6M*&O zJsBu&N4v?@nJ((Hz$2!RtUC|zmjt(DQZwk^tU_jN$O$riH+aBZf7T_n7=uP`2z}?a zrMgf*Fjiz#%Sh2TXu6C-MOO`c+QE$4ONN=J5(C$7O99++aA#)VP`XQ7Asde=>&ksf zq@r9K_uOFjsH1v(PrCu`mzjA#z!H*6gXyuDNZ!g25*)zzr*l+1sJK14H$JZ|wp1Y^+XE5bEIstk+}o3Q^9SW1 z!}3;tFM6`04@xgpmTg{-W6)X|ovThxg?)xwiBFX`fg;HeG5(byD61VClr{nBeyY*4 zJ+xyd1Bvvf5)OfEcDwTP)0;6XdP>`6GN7yK2)C1`jUuXy#OVFatj#7|1B2^ZJzMOV z6vow*=t4-w|RcAaZ12 zeX)c~s49`O0KZi25*mDiPq@crx%LKAPQF0j0gLJ%W^egu#JL!&wa&f7LwE*Cs*>Rt z;H)+#3P=o)0gLs{0g;6Au=ltp+pst@JOW8t_8t9Y036vYs*eQJ@EQ3g>B%8SHFz(J zPs%%`NT8g`rls=pZ2q$M@~VDR_EMU5ZZxQf4|j75r!t09x4FTG(*tLcZdW=?c9Zy) z|AbpN(~$1Rw6_|di4e%?^eTuUUMFT#lMgdReD_gUuB$mVw|r9~*vJ zu0D>_ah^@XHD!MR);p&9mXuQ&8sf-6u&w^|#2>PRN{nGq#WTwllj3ubn?#>xYp3xR zb<;cy>ZY~R>(dYU=ZFs|4@W6m)d}ol?hzXnhS8~h2Tlw8WZ)neuW|2?mi!6=D(?DB z@T-@Pc7vU2ECf@*>3y4f83}awRT)xLqnm&*U+j@qKs*#nl&dir-%UOblF{iVIeB}r zdv%;*T-`s)d&+Ho2CtfOX+G+n^X_)xXqL<){3cO2SE7X5S>ty@d7OHgSvEMpN%_r0 ze-Pu+widR_$G^5h$Gh*RzL>fz_p2MAnvWsS<-3<58lchdd2s2f|&B09_K?Rd@YI5hLUPQbqaqwue7FO@@P@@ z20C(RWBm=@es;n{l-C=x3h9CaWOeMlC4km*#dqWJ<@4ipCCTB-6PYMf$2kbHwNh<6@8CToaPp9) zX*SY0I4X6xAd!_Doy*is2uBEv5FnME%M?czP2)QJ5bROT*8t(i2#8| z5|^xs?J!N{c@S*2@NC3@)F~~!hcDIKK_V1kh&YAcNPe&;Eu55esm-rV-V)3enezaO z+8iBWH|;5-Up7`c*dm#3Bbj}{Isehr84v#Gm#D#Ap0A=AqO z4UghOjfFUfl;)ynyJ8V`Utz!Oozz4>&nXrB#& z=EA8U_SNegbV|?~R2yv^Y2+KjRJ{OP9NHnQ1NsAmO`7Vl&@IqI3+h1>!9+@m?t|Ez z5*45ngh+9e`i{UA=GhVJJn28iQhL&xQDj(4Ewyb9xz6b;(#z}P(#QD0r_DnLzkV=wYd%^N@VagdK<3SbO z${OvhPAT4>CZx%FRAWpwJXH{Q8~F(|MS`e;0v4`t7LqC#fdxLbaBvj$kkN#RvIe1{lSBb#bgt#N?HYHm`BR0J%-wk zfM}e9Dsr(upbT+gMN2DEMk>478Yw96h}Z#`a`O;~9VxjWN7C$FV65e}USIH}A; z-FB!EABm)}w|WFO!b*#$kZv`cm--Na^I?T4q`^H{cW`TUjAD~0*G$zDvk)C*34F^( zT8%_I0Gfj_0!4HvsaS13_yXPs$s?gy3Q<)}#*xZ0X$#-p0(Y#ERf6wy4V+AMttqZr UTMhd`Eud;Di_jA!U6c8L03Lc80ssI2 literal 0 HcmV?d00001 diff --git a/tests/test_Pyramid.py b/tests/test_Pyramid.py index cfd86eb..7a888a6 100644 --- a/tests/test_Pyramid.py +++ b/tests/test_Pyramid.py @@ -158,7 +158,7 @@ def test_vector_ok(mocked_tms_class, mocked_get_data_str): @mock.patch.dict(os.environ, {}, clear=True) @mock.patch('rok4.Pyramid.TileMatrixSet') -def test_tile_read(mocked_tms_class): +def test_tile_read_raster(mocked_tms_class): tms_instance = MagicMock() tms_instance.name = "UTM20W84MART_1M_MNT" @@ -166,8 +166,6 @@ def test_tile_read(mocked_tms_class): tm_instance = MagicMock() tm_instance.id = "8" - tm_instance.resolution = 1 - tm_instance.point_to_indices.return_value = (0,0,128,157) tm_instance.tile_size = (256,256) tms_instance.get_level.return_value = tm_instance @@ -181,8 +179,37 @@ def test_tile_read(mocked_tms_class): assert data.shape == (256,256,1) assert data[128][128][0] == 447.25 except Exception as exc: - assert False, f"Pyramid creation raises an exception: {exc}" + assert False, f"Pyramid raster tile read raises an exception: {exc}" + + + +@mock.patch.dict(os.environ, {}, clear=True) +@mock.patch('rok4.Pyramid.TileMatrixSet') +def test_tile_read_vector(mocked_tms_class): + tms_instance = MagicMock() + tms_instance.name = "PM" + tms_instance.srs = "EPSG:3857" + + tm_instance = MagicMock() + tm_instance.id = "4" + tm_instance.tile_size = (256,256) + + tms_instance.get_level.return_value = tm_instance + + mocked_tms_class.return_value = tms_instance + + try: + pyramid = Pyramid.from_descriptor("file://tests/fixtures/TIFF_PBF_MVT.json") + + data = pyramid.get_tile_data_vector("4", 5, 5) + assert data is None + + data = pyramid.get_tile_data_vector("4", 8, 5) + assert type(data) is dict + assert "ecoregions_3857" in data + except Exception as exc: + assert False, f"Pyramid vector tile read raises an exception: {exc}" def test_b36_path_decode(): assert b36_path_decode("3E/42/01.tif") == (4032, 18217,) diff --git a/tests/test_Storage.py b/tests/test_Storage.py index 175568c..4c1d05b 100644 --- a/tests/test_Storage.py +++ b/tests/test_Storage.py @@ -64,7 +64,7 @@ def test_s3_invalid_endpoint(mocked_s3_client): @mock.patch.dict(os.environ, {}, clear=True) @mock.patch("builtins.open", side_effect=FileNotFoundError("not_found")) def test_file_read_error(mock_file): - with pytest.raises(StorageError): + with pytest.raises(FileNotFoundError): data = get_data_str("file:///path/to/file.ext") mock_file.assert_called_with("/path/to/file.ext", "rb")