From f003b55a5344490d1dadd881c4b68cbd4aee79f4 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rapha=C3=ABl=20Gertz?= Date: Sun, 1 Nov 2020 22:29:05 +0100 Subject: [PATCH 1/1] Add osm map generator --- picture/marker_shadow.png | Bin 0 -> 374 bytes picture/markers/bullseye.png | Bin 0 -> 1250 bytes picture/markers/lightblue1.png | Bin 0 -> 317 bytes picture/markers/lightblue2.png | Bin 0 -> 417 bytes picture/markers/lightblue3.png | Bin 0 -> 435 bytes picture/markers/lightblue4.png | Bin 0 -> 387 bytes picture/markers/lightblue5.png | Bin 0 -> 434 bytes picture/markers/ltblu-pushpin.png | Bin 0 -> 1369 bytes picture/markers/ol-marker-blue.png | Bin 0 -> 992 bytes picture/markers/ol-marker-gold.png | Bin 0 -> 831 bytes picture/markers/ol-marker-green.png | Bin 0 -> 967 bytes picture/markers/ol-marker.png | Bin 0 -> 606 bytes picture/markers/pink-pushpin.png | Bin 0 -> 1424 bytes picture/markers/purple-pushpin.png | Bin 0 -> 1418 bytes picture/markers/red-pushpin.png | Bin 0 -> 1334 bytes picture/markers/ylw-pushpin.png | Bin 0 -> 1233 bytes picture/osm_logo.png | Bin 0 -> 1167 bytes public/osm.php | 268 ++++++++++++++++++++++++++++ 18 files changed, 268 insertions(+) create mode 100644 picture/marker_shadow.png create mode 100644 picture/markers/bullseye.png create mode 100644 picture/markers/lightblue1.png create mode 100644 picture/markers/lightblue2.png create mode 100644 picture/markers/lightblue3.png create mode 100644 picture/markers/lightblue4.png create mode 100644 picture/markers/lightblue5.png create mode 100644 picture/markers/ltblu-pushpin.png create mode 100644 picture/markers/ol-marker-blue.png create mode 100644 picture/markers/ol-marker-gold.png create mode 100644 picture/markers/ol-marker-green.png create mode 100644 picture/markers/ol-marker.png create mode 100644 picture/markers/pink-pushpin.png create mode 100644 picture/markers/purple-pushpin.png create mode 100644 picture/markers/red-pushpin.png create mode 100644 picture/markers/ylw-pushpin.png create mode 100644 picture/osm_logo.png create mode 100644 public/osm.php diff --git a/picture/marker_shadow.png b/picture/marker_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..a5afa6edd9e4a5a525af486f26d962539412d838 GIT binary patch literal 374 zcmV-+0g3*JP)&00004XF*Lt007q5 z)K6G40000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz2uVaiRCwBq zk_~TyKny_TD59Gv`u~69;-*eM6l|AwNk?G2CNFR)JlfK1l^#JUlv3F$8%4mPSMJJH z5@Z=KnrH`a%38_E8&9Mn3DuQ|4oc-J49H>#=jJbIj=*F`#OoQE?X} zRf2E?TcJj|AiHoL#I3_SE$^9Wm=Q%;$4;8)i~F9+e`Gm}U9&zV6-LQ`s7KZy`R3Y@ zAN|5cVa-n(dGO&xMvJg@`Cl?Gt@z8qeYtgX$fIO%UCf3!+099OCC~pP(|8Fm0O%HGMjI3I;NF_!J){w_+n1$NPVDjRTJ zji9@*5}S(IlcL`nRA~OG0;LJt*21$jGM`Lk# zWxT{eIri(3`NYFKGO$P(ydiFhh(GqzIbPxh&__q$=g8dF%PE5bOWZ2DAyO8P^@GTR zJNN@jBJ(jR#X*6%DI$FF-SCfP+^{!GYhOm@g^+a9g3}}C@~#H++*r`Xk-&<`Jg1vk z%}rbpISylUBM0;_Tb92rkR{p=vAj6^snkSZbINmQ9LG5#zDe*|WSpBfT4&a&wc?-Hm-2UD zVH;mJAh0D`??_VKi;U;L#EE$$wrADIIcZktzF+=X9yqt1H}b|=%}KKUWe_RbniICB zL%D^%tlWPgZ}9Ssad%#RH59l3O_BNS06lz#Gb$Xrr*KxaCT2X)l{INQ4NdA_6ge}2 zz{Y6LoN|NnpI|ySN8+Seg)>+Wu0db4@5xn1zgZuKRZI;$6`B7@=p7W;!M>Dr5$WU! zbdRUFlu*coOp9DS?R-Bd5Sn;cxlyUWg0(CiFM&NQ3BxO%UkY?p=*sXW2j{aVa7`sU zFmFDG-Wr~cMvas(g9k&_sKsq(Ya81u&L4`ktf(=M+0sX6xrZ1vRxx!#_Bvfz#r;f? z#g&FyqmP$m^OP7r1(r@`eWNL;D@!GNBhC0$b5en8 zaj)9N>!vBR<{BPVh)ho98QfRr{3C&nO6&+((J@dNO-h*=vU~kJ6@5k(0nfIvIDT>? z3LHRBHso2Yf%`cpeoeW(at>1sBNnX1Y^v2F6B#G-(clnP7HAns91RZ9Ut;V!Z M07*qoM6N<$f*l1;7bJU literal 0 HcmV?d00001 diff --git a/picture/markers/lightblue2.png b/picture/markers/lightblue2.png new file mode 100644 index 0000000000000000000000000000000000000000..47ab258013887c6b829f5c433146484a4575b1d4 GIT binary patch literal 417 zcmV;S0bc%zP)EQ zOC*O0vbQ=S7#KP?qZ&-KAs_=lfeVV6iWRuk5saPpUm;-w;^PWfMsSKnOKdJW3=F#~ zv4@juJ7!|TY6x{w?6T=V;v5j)BEl3^EQTzzVz99If5OPf2xy89K_l4MjD9gdy#v7v z0snP$bS{7R@PY3?kPE_p{`_HrvC%P14q*sG%6}0N(bsqG+))Bal7hj8FxqeW&&J00 z^U$F~Hpn)^6rr=x`4E>di2k29Z(agEClmBeNl8gJE``KkfB*vk*RLLeOaB_h00000 LNkvXXu0mjf!5ge> literal 0 HcmV?d00001 diff --git a/picture/markers/lightblue3.png b/picture/markers/lightblue3.png new file mode 100644 index 0000000000000000000000000000000000000000..21f5912e34a103f056777c93ea04605c13780a51 GIT binary patch literal 435 zcmV;k0ZjghP)^%wz@zL2d>H z7aazM-IWkFNrr$x#R>)nlNttwut^XDj1}>P2^KJGAA~OVg}4gj6_ULJ104|z3`$~< zaKQx#8p0UOz>q!{5-uPEi8cgeGsqht8s@b{C6FX37;Ffm{igqHYM3M7RI|002ovPDHLkV1fv3obmtw literal 0 HcmV?d00001 diff --git a/picture/markers/lightblue4.png b/picture/markers/lightblue4.png new file mode 100644 index 0000000000000000000000000000000000000000..aff25c37c070d1a0e07310540049ca5681ab1f67 GIT binary patch literal 387 zcmV-}0et?6P)$>yDJ$Oj1}>@1P>78W?-0^452|78zAVCRe88I z6J{C6FX37;Ffm{igqHY2>zZcWEcW+ z$?B5~3}KV-`-lmb1jrkL+z?#u%fO%{My4S!*K|ZMFq~;Y4IiQm0r|gT1p|X}Ap?U+ z4I+$iM==&~?-c_>=Vk=|?0wu`!fFUe@!fuiMvy@uKFC`jmtg~p;1r7`v4NZp3JXxc zf&eI%(&s|b3VLG0X$S~_3;+ctNF&HqxKb>3LzYbk66b*U77^+GIhHV4X2oD(@&AO8 zkrB`o9fC%%u^IhhfVu>N83O+6=;&Pj@ZkgBe;^lx|NQyG1Y@IPm>j|ohLryzBBHPF z+_|F!k|YI#4Pmt3^q-B5@8_XIhis5-hABd4qw^syVG#X4Z{EBFd`>3losyE0Zd?k9 c!2kgU0HLfQ<&ons+yDRo07*qoM6N<$f?^D>>Hq)$ literal 0 HcmV?d00001 diff --git a/picture/markers/ltblu-pushpin.png b/picture/markers/ltblu-pushpin.png new file mode 100644 index 0000000000000000000000000000000000000000..64fb973047bddf701196d0306298c1b38b064061 GIT binary patch literal 1369 zcmV-f1*ZCmP)Px#AY({UO#lFTB>(_`g8%^e{{R4h=>PzAFaQARU;qF* zm;eA5Z<1fdMgRZ+32;bRa{vGf6951U69E94oEQKA1j0!~K~z}7y;p5aQ&$*npk!U*J(!!kG z+*)Lwo~_dP^IOFt(YF{21>E1Za7J7IlYoOvp=j41K1}A87K%D>fL0b3PJC!E3}d_z z@ACl9*(Bh)I6VAC+Q0zij*XE8lfMQw0cp>llm5sNT9%abr;}V>gSmRZPG|y-3YF@2 zb9XoCPMn~)>(?ps)hnI=L#`FcPo7Y4em==OJlffj2}yu8qbfdrLW?7aJbIKq+p~wb zQ>Q5T@ngz)^M-Qpfv*7Oo%CnV=%duszp>^=KrR#k(SijF>SEymZDS)vpE*MjAfn#4 zk3!4Ki9>(=jT@9QILLctGq55rkL<!?|-5 zfjCfCR#Mo(gQPijj3VmlXo*h82owrMz#LgzOqpq&@$$izTF|0{u0VxOp2M33u4Og#H($lB>j`b%`lHu%G{+azoBOanaV3D8SAf^`p zDj|c=*=zaoKe9(h$$aMyZ=4y7K7D!;#!HtdbnjlWx3epr4ITI-cMp1FRS`(rL&<^#`K9|VzNozl;*C$XxEw)FQ?PEQYg2?8wrW^#WF#y`+#MzPLE z2m+xWYqeuL;O=}3Zo#>yL1L4DnDgiVyL*hSL6LHn$$k~07%g%4@oC%k@F9JVfjn!` z$%5{$>*yfu@#B21PbFZuaDhH8Dc|LfKygVzETo|H zCPV8JQGnv_-6Qku+mvwsJ|#YSM6tJSk#}U|OW0d%%Mk>4`}=o(4z=4jK2Bfs_0f9l zju~3l*-2|rhFKt*u3aM&o=wPo4g#cSv4G#;k`k5)-`N_3nx$s*cwBEUB|LaQCK%){ zUL*swpXomfLY4_E7I;`yF{Z7JFVhmKv`C0F)Wqfy?V%7qj{kW33(~^^6EzLePfkx!EeRy8;!=1D#)@-Ci{6xop7~6 z4mi!`{{l;CX({F5euw7-(K|Go2q+Ya+Un|R3JeVFMb~An2`u6`ZnzS6KB-h%CVIza z3xQ1~P&bRk!d`N7P5`2^BR4mfe0_bp(49Bu1jJ%-hEk~{i9})&+0bk`0uOj0W2Sqa btpxr7j27EJF$e`;00000NkvXXu0mjfqPlIz literal 0 HcmV?d00001 diff --git a/picture/markers/ol-marker-blue.png b/picture/markers/ol-marker-blue.png new file mode 100644 index 0000000000000000000000000000000000000000..83a90b4c85f708b08220ff501e281b6df6e1171c GIT binary patch literal 992 zcmV<610Vc}P)X1^@s6-qmI800004b3#c}2nYxW zd>{!xLrWaJ zX<&2cGVi$Fn;O%iVYe{MyHLDr%-V2_xvjO8>z;f5pY!~B(I&gQXWOOv!Sm+#{eC~^ zJUq`iKM)b-TL3BqpV$ImaY6q141yr;lH{Pea?K`7_J_s*Z1~qu0LA{m!uFEVGNt}R znvO>`+EI6&0->-b`9mK7@XeNGlYpFJj6Eg$Ll>UdxOLG>)yD#&C_m6L_eXI0#8z!& zu1$!F8;$qHqacvFaI5b6@xO_~hUwT#g>XhkGhuXc*9~3CGgmyh8KM+`BnLs9qpZ9#&tn=Y;?3`BhMuV=B3A$aB1&=YwtpKxV$BS! zEZ>Nl!{6bBEe$x(m_{HJ&VzmvJ8ZeGeTj&!1G!h~VMz}5)_wGIXvwliJ-6spzuoIW zW8_)IHnkN*G!6j5lt@Iw#QD)gORZKg5kOnhPL(@${S+_<3IL8{9=qG~W45;|SrG8% zwJ7~QbZ5|Y?WXDd94HYPmZ`oIJGo2c+?^9>Xc;70_UeYNR1*=O6*>uyXEWnH*E^c| zOl^8yjvg{Och3`1=S(dR3IL|AyxIQ6K~q;JJb}XlX{3^8EK^r%y>w3~5#0tTcBQSs z^w4nb)3;Q|vGx+tp9Mn!z%;V^QpwZK=+G}Y{mx`7{V{sCpSasRTXt3`5sh)zZHRwX zqfYg-?0sB3vtKv=IULW=dQK<+xUSte*ne}P=hoK%fUnNJXK-@Q5z(!=a)nINs^TTf zv%BBFN|GF$08sp&rzsI35G=a3AY5XAvF-oMh@O1g$9EK2H literal 0 HcmV?d00001 diff --git a/picture/markers/ol-marker-gold.png b/picture/markers/ol-marker-gold.png new file mode 100644 index 0000000000000000000000000000000000000000..2ff9ec52813915962a1f15d9b481cb769b102d18 GIT binary patch literal 831 zcmV-F1Hk-=P)X1^@s6-qmI800004b3#c}2nYxW zdR7i=X zm0L(uQ51&1J>KS=IZl?TU6ANPJtT>sX4w@Xirx%_Uc%}vgDw!1LJ*};FA<>_71o1g zqy>seJ(OK2%Y>whsZl`}1fy)6GdeRms|Ot!ouf{=;D6cs-{1Kci?cT(!gK=GL`PEv z%#FxDogq4kBHfOemxE8&=mj>+7z!lBJ7`?Bl>V+JL^_a$3S^FfN4HZ7MEw^O$Z=@& z9N5i(w|xW{)X&FAZU&~)pbbc!77D1iSc;tnW_`tYSg3~IBc+G&>vsBq{7IoeveUuS z%ryGHH%|@>RZ9)BAPFNMK{8wfWIY zSic*J&%??c;Bs60_U5BjuRwq#8*sU&moHU!5i4`u0~qvzXAo=(9=2FRYwtt%SAO`1 zC<_iLJHd(RdL2HDhu09@J|aU${Cokgj`>7X^7XWHBDN3nDS{&W)8qk-eTDNFbA3i}=0sWooOO6^*n z%Jt4B98pn|16^)dl82|y#TF514c)U%G>b@G?;koY-6Akm$`j}D28OAf2n<53ZmINm z2cADKt^fHqcM;u=3z%nhJ}l|zhuTHBU2*|$_#PA%V|slY6_MYTZA@`VCuwoGI~vEQ zyjn`YY4DcOdHnZt5*x#@%~`mEz~3#1)4&8WX8cA0F^10f#>x@s{#^_hI#*`>@Buqh z7vO$=1JUgC0SU8)iU>}FXUT~SDn(%={)nJJdTb2UQw=9n{{ZUlb)-Lb_=Nxf002ov JPDHLkV1l45bA|u_ literal 0 HcmV?d00001 diff --git a/picture/markers/ol-marker-green.png b/picture/markers/ol-marker-green.png new file mode 100644 index 0000000000000000000000000000000000000000..17168f1b91a857283440eb923328ff7743c276d8 GIT binary patch literal 967 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 YA9@CK7|n9e!vFvP07*qoM6N<$g7*l79{>OV literal 0 HcmV?d00001 diff --git a/picture/markers/red-pushpin.png b/picture/markers/red-pushpin.png new file mode 100644 index 0000000000000000000000000000000000000000..203512d5cdf92a3ccddbd69e84e239272c9b4ed3 GIT binary patch literal 1334 zcmV-61Px#AY({UO#lFTB>(_`g8%^e{{R4h=>PzAFaQARU;qF* zm;eA5Z<1fdMgRZ+32;bRa{vGf6951U69E94oEQKA1fNMnK~z}7#aC@iQ&$*np;U{E z*4he7Mwv2|j}QwOhA}E)#eP@?K|X>A2tg50G^m7RA=$!~Y)I&aKW1s?m3sswh%NK_v%javgE#X@#5~#g$u8GDU~(&JqHK|++K8eMqB@pKw9~#RYWBvL>w&EBq}JFyzbvmWBK`XDKU}Kf`cDJ zna{A_C^Z3pv%mk)FEHL607&<+EY@fH!Y3E5uWnZtJzB(QW41fA}NXYlH0V2 zPQd$vAag&wbHP{(zzm;3 zIG75bgUmUQISQ}yLqq8;wYnY0BBaUzOW)N zUS4h39|fqStOBb8Wk^uq+LkRm0VeYl7?~fCoK@%**jp%hADF999O=r-DZ0 zo9*dS$lvxH`P;W{rPAjW!*w*Z0Dn_pAxXWwNqnOflyD2s|FzzMbylxd#Ss!(az$of*Cb zu;)(T$N2ckM8x&I$VjF_f|wl8Ez@c{dg0|G5V#40?8V=q#ZI+cmV`|DMge?V23oPF z9^t@uK&99+3|ypEcQs(h^gz~DWcgIRH$4YVp&CwMB)iGw?@G~#eCH?>b$KBn+Wh>6OCloZ!>B0w1k4aXTx+r|2Oa4_H z?{GM%y1JTe*u@9|aX>nd3nU9)!R{~R{{pR6Tg!1A*=)8)c=VIaVu>LzABOu|T3QH1 z&d6rD#1P=+uc)YCf6RL21avyxahJ-v4+3l*1qx&$*G#tl0#IU@)NF*~umAu607*qoM6N<$g45SsZvX%Q literal 0 HcmV?d00001 diff --git a/picture/markers/ylw-pushpin.png b/picture/markers/ylw-pushpin.png new file mode 100644 index 0000000000000000000000000000000000000000..c33c52034842326d224841d0ba5a9b14275f4086 GIT binary patch literal 1233 zcmV;?1TOoDP)Px#AY({UO#lFTB>(_`g8%^e{{R4h=>PzAFaQARU;qF* zm;eA5Z<1fdMgRZ+32;bRa{vGf6951U69E94oEQKA1UgAXK~z}7#g}hL)OQ@m-@oto z_md>2Qxsf8#>V1qtv%>L4+g&o_kMjp-_M`l4EY5=bR(A3Ygqz@<6N)DiIfV^G1vA_5*mw5`ers z*${~chQsQF0|QF<+BNXfC9tgxym13;YSLL#WBg^e%Rd0TX;luaE-x1$(^TSt0NB^3 z)}au1`?iWeD5SBdNc;}qEdUu7R)JQ0{J5Np$3dS@i7)g(0E|Y#Q>O$0?XxucKyq8P zN*wn2B!`Dp`6UB*^a!k|&_@BRu^K>b*&_a&oK&GsgnywA4uU;Bg4x;P=QKOvGxkPC zhB#bQq_;LS7_+9CI{af};E^MefVRU504+09`+EO=V>%Gf8H)){O@ZNXa)7=*@Zm#^ zTer#}fYoUO7>1}ncTPSXJm8Zj;JthEWw-eB_wR$Pt%5>`uTtINe;G!lb#=y)t)U@R z?|#23y_2)`Cm?Fl1}H2vetP^^PqxL;Q6=c{fW5uyIuea28U^d?bpqP^X#v=5 zM$7cHObS4Pb8}!U29AuVsNB7))`iYG1cWbNU z#DvOzzkj|127{_0g+gj1CuT!93|_b(D1`Q<6^$q_GgJI{;DEtUNN{XSi3Wr7Fbm!1 zQ;}+H6a?^rg{@e7ckNp7+rfi5W>;4cA3V@FKCZ4N8U-T}wT{I=uUB&8M%fMEWvgdF zw!={|aOFxbi;D{)J9i>lUvIFnQSkI>!DGjC?%r*fg@v*i!0T4df`q;2bUJzVY!d-| z3?LiON&ry_h)kVdWD#-JNi+H7q{MPx9hpdvC96cj&*;1@-i;H?w(LD(jK*sS8_ zP?#Odsk!)n^dCXcB-@asd*DaTdwSlJ^FPn!oK#cgn+~?6zP^6F z(P*?MlgTrYNaSPm?@|?H`Fy_U-?cL5dCcv0f7a2_(U4B3RVI^BX0usonx>|vrj7>! z0WZb`SAyVjY@oltKPS}H)qNr2feQ>aH#h$`o@pY9hSXb<2r_;F(`I$oV z(_-Vo;qdd4*A9o{8CBs{R4^)XZ73AFRK`5B@pwE7Pq&sB_Y#2AhEcd;s17IS>a@ z?Y{+5Gy1?jj*(5e6+8fvU>Ljw?gc;b-NI(iUA6mh6dfBM9~TkU5<|Bm8uEI*{&%#W z0#Oi=ejt4r@Ht3v10I!htoM@REGj=m}(I9O9tlcmV>;4Bv@o;d;n4CBjO*wY**l|KgF1&dsKlzqQ|bHLB= zKh6!4%{u{l=-pqzAs|QQ#cL{Bxm+$13fs_-N8JT4XOnP`8`)&w9H0r z;_epR;yo_szJc`{bht{YzP`REySuy75coa9cV}B$+mYVh-e6Z(mwSGGUUF~)Uq8&8 zm4(`vU$O}=)58rEa~F7#i%ik;x6osSwvnH2axU@eEYLHj4NQl6@H#i|%C43WyLY44 z+J8rrK^;D2QYni^?f+)-lUy!4>vFlaL2!e~WYQ9eMAq;3pPQSTlgj%xmy zhP~CRTN{mPA*xfUWxbmGIg<4+WU3gRVm0(&kbM$P@+G%lr=wMlt%<@BSE?}meJq(x z+8$r8Wp%3qVk4SbO6pW-NmH?eF3fQS!EsVB3CFJMc$b)_=(0>>81LTbwXA7%nEn!* z(nG9H9h!+Qh8LGR8ICK$N_yC0(sm4ct!pHVFGT+#HcGJpbpx59x=Oph$!_>Fd_`osm|osmar|cycle|mapnik)/(?-?[0-9\.]+),(?-?[0-9\.]+),(?[0-9]+)/(?[0-9]+)x(?[0-9]+)\.(?gif|jpe?g|png)$!', $_SERVER['REQUEST_URI'], $_GET)) { + throw new Exception('No request match'); + } + //Cleanup match array + unset($_GET[0], $_GET[1], $_GET[2], $_GET[3], $_GET[4], $_GET[5], $_GET[6], $_GET[7]); +} + +//Check latitude value +if (abs($lt = floatval($_GET['lt'])) > 90) { + throw new Exception('Invalid latitude'); +} + +//Check longitude value +if (abs($ln = floatval($_GET['ln'])) > 180) { + throw new Exception('Invalid longitude'); +} + +//Check zoom value +if (($z = abs(intval($_GET['z']))) > 20) { + throw new Exception('Invalid zoom'); +} + +//Check width value +if (($w = abs(intval($_GET['w']))) > 1024) { + throw new Exception('Invalid width'); +} + +//Check height value +if (($h = abs(intval($_GET['h']))) > 1024) { + throw new Exception('Invalid height'); +} + +//Check type value +if (($t = ($_GET['t']=='mapnik'?'osm':$_GET['t'])) != 'osm' && $t != 'osmar' && $t != 'cycle') { + throw new Exception('Invalid extension'); +} + +//Check extension value +if (($e = ($_GET['e']=='jpeg'?'jpg':$_GET['e'])) != 'gif' && $e != 'jpg' && $e != 'png') { + throw new Exception('Invalid extension'); +} + +//Check imagick presence +if (!class_exists('Imagick')) { + throw new Exception('No imagick class'); +} + +class Osm { + //Set the tile size + const tz = 256; + + //The imagick instance + private $im; + + //Set tile sources + //XXX: see https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Tile_servers + protected $uris = [ + 'osm' => 'http://tile.openstreetmap.org/{Z}/{X}/{Y}.png', + 'osmar' => 'http://otile1.mqcdn.com/tiles/1.0.0/osm/{Z}/{X}/{Y}.png', + 'cycle' => 'http://a.tile.opencyclemap.org/cycle/{Z}/{X}/{Y}.png', + ]; + + function __construct($t, $lt, $ln, $z, $w, $h, $e) { + //Get tile xy + $tx = floor($cx = $this->lnToTx($ln, $z)); + $ty = floor($cy = $this->ltToTy($lt, $z)); + + //Calculate start xy + $sx = floor(($tx * self::tz - $w) / self::tz); + $sy = floor(($ty * self::tz - $h) / self::tz); + + //Calculate end xy + $ex = floor(($tx * self::tz + $w) / self::tz); + $ey = floor(($ty * self::tz + $h) / self::tz); + + //Create the base image + $this->im = new Imagick(); + $this->im->newImage($w, $h, new ImagickPixel('white'), $e); + + for($x = $sx; $x <= $ex; $x++) { + for($y = $sy; $y <= $ey; $y++) { + //Set file + $file = '../cache/'.$z.'/'.$x.'/'.$y.'.png'; + //Create cache directory + if (!is_dir($dir = dirname($file))) { + mkdir($dir, 0777, true); + } + //Fetch file in cache + if (!file_exists($file)) { + $url = str_replace(['{Z}', '{X}', '{Y}'], [$z, $x, $y], $this->uris[$t]); + file_put_contents($dir.'/'.$y.'.png', file_get_contents($url)); + } + + //Set dest x to + #$dx = ($x - floor($this->centerX - ($this->width / $this->tileSize) / 2)) * $this->tileSize + floor((floor($this->centerX) - $this->centerX) * $this->tileSize); + $dx = ($x - floor($cx - ($w / self::tz) / 2)) * self::tz + floor(($tx - $cx) * self::tz); + #$destY = ($y - $startY) * $this->tileSize + $this->offsetY; + $dy = ($y - floor($cy - ($h / self::tz) / 2)) * self::tz + floor(($ty - $cy) * self::tz); + + //Create tile image + $tm = new Imagick($file); + //Add it at destination + $this->im->compositeImage($tm, imagick::COMPOSITE_COPY, $dx, $dy); + } + } + //Add circle + //XXX: see https://www.php.net/manual/fr/imagick.examples-1.php#example-3916 + $draw = new ImagickDraw(); + $draw->setFillColor('#cff'); + $draw->setStrokeColor('#00c3f9'); + $draw->setStrokeWidth(2); + $draw->circle($w/2 - 5, $h/2 - 5, $w/2 + 5, $h/2 + 5); + $this->im->drawImage($draw); + header('Content-Type: image/'.$e); + echo $this->im; + } + + /** + * Convert longitude to tile x number + * + * @see https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Lon..2Flat._to_tile_numbers_5 + * + * @param $ln The longitude + * @param $z The zoom + * + * @return The tile x + */ + public function lnToTx($ln, $z) { + return (($ln + 180) / 360) * pow(2, $z); + } + + /** + * Convert latitude to tile y number + * + * @see https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Lon..2Flat._to_tile_numbers_5 + * + * @param $lt The latitude + * @param $z The zoom + * + * @return The tile y + */ + public function ltToTy($lt, $z) { + return (1 - log(tan(deg2rad($lt)) + 1 / cos(deg2rad($lt))) / pi()) / 2 * pow(2, $z); + } + + /** + * Convert tile x to longitude + * + * @param $tx The tile x + * @param $z The zoom + * + * @return $ln The longitude + */ + public function txToLn($tx, $z) { + return $tx / pow(2, $z) * 360.0 - 180.0; + } + + /** + * Convert tile y to latitude + * + * @param $ty The tile y + * @param $z The zoom + * + * @return $lt The latitude + */ + public function tyToLt($ty, $z) { + return rad2deg(atan(sinh(pi() * (1 - 2 * $ty / pow(2, $z))))); + } + +} + + +//Match url +header('Content-Type: text/plain'); + +$o = new Osm($t, $lt, $ln, $z, $w, $h, $e); + + /* + //Get center x + $cx = $this->lnToTile($lt, $z); + + //Get center y + $cy = $this->ltToTile($ln, $z); + + //Get offset x + $ox = floor((floor($cx) - $cx) * $tz); + //Get offset y + $oy = floor((floor($cy) - $cy) * $tz); + + //TODO: see this fucking computing + $sx = floor($cx - ($w / $tz) / 2); + $sy = floor($cy - ($h / $tz) / 2); + $ex = ceil($cx + ($w / $tz) / 2); + $ey = ceil($cy + ($h / $tz) / 2); + + $ox = -floor(($cx - floor($cx)) * $tz); + $oy = -floor(($cy - floor($cy)) * $tz); + + $ox += floor($w / 2); + $oy += floor($h / 2); + $ox += floor($sx - floor($cx)) * $tz; + $oy += floor($sy - floor($cy)) * $tz; + */ + + #$ox = floor($tx - floor($tx)) * $tz; + #$oy = floor($ty - floor($ty)) * $tz; + + #var_dump($sx); + #var_dump($cx); + +# var_dump($sx); +# var_dump($tx); +# var_dump($ex); +# var_dump($sy); +# var_dump($ty); +# var_dump($ey); + + #$im->newImage($w, $h, new ImagickPixel('transparent'), $e); + + #for($x = $tx; $x <= $tx; $x++) { + #for($y = $ty; $y <= $ty; $y++) { +# $my = new Imagick($file); + #$my->newImage(5, 5, new ImagickPixel('black'), $e); + +#$this->offsetX = -floor(($this->centerX - floor($this->centerX)) * $this->tileSize); +#$this->offsetY = -floor(($this->centerY - floor($this->centerY)) * $this->tileSize); +#$this->offsetX += floor($this->width / 2); +#$this->offsetY += floor($this->height / 2); +#$this->offsetX += floor($startX - floor($this->centerX)) * $this->tileSize; +#$this->offsetY += floor($startY - floor($this->centerY)) * $this->tileSize; +#$destX = ($x - $startX) * $this->tileSize + $this->offsetX; +#$destY = ($y - $startY) * $this->tileSize + $this->offsetY; +# $this->centerX = $this->lonToTile($this->lon, $this->zoom); +# $this->centerY = $this->latToTile($this->lat, $this->zoom); +# $this->offsetX = floor((floor($this->centerX) - $this->centerX) * $this->tileSize); +# $this->offsetY = floor((floor($this->centerY) - $this->centerY) * $this->tileSize); + +# $im->compositeImage($my, imagick::COMPOSITE_COPY, $dx, $dy); +# #floor($w/2)-floor($tz/2), floor($h/2)-floor($tz/2)); +# header('Content-Type: image/'.$e); +# echo $im; +# exit; +# +# $dx = ($x - $sx) * $tz + floor($w / 2); +# $dy = ($y - $sy) * $tz + floor($h / 2); +# +# var_dump($dx); +# var_dump($dy); +# var_dump(floor($w / 2) - floor(($tx - floor($tx)))); +# exit; +# + #var_dump($url); +# exit; +# $tm = new Imagick($url); +# $im->compositeImage($tm, imagick::COMPOSITE_OVER, $dx, $dy); -- 2.41.1