From b22dfb7ebbe4e15a70bd2acf40877e888f2a40ba Mon Sep 17 00:00:00 2001 From: RudyTheDev Date: Fri, 16 Nov 2018 00:14:54 +0200 Subject: [PATCH 1/6] Change the fill pattern definition to have strict tag-value pairs --- modules/svg/areas.js | 56 ++++++++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/modules/svg/areas.js b/modules/svg/areas.js index 78149c19a..368ff4331 100644 --- a/modules/svg/areas.js +++ b/modules/svg/areas.js @@ -11,35 +11,45 @@ export function svgAreas(projection, context) { // Patterns only work in Firefox when set directly on element. // (This is not a bug: https://bugzilla.mozilla.org/show_bug.cgi?id=750632) var patterns = { - beach: 'beach', - cemetery: 'cemetery', - construction: 'construction', - farm: 'farmland', - farmland: 'farmland', - forest: 'forest', - wood: 'forest', - grave_yard: 'cemetery', - grass: 'grass', - meadow: 'meadow', - military: 'construction', - orchard: 'orchard', - sand: 'beach', - scrub: 'scrub', - wetland: 'wetland', + landuse: { + cemetery: 'cemetery', + construction: 'construction', + farm: 'farmland', + farmland: 'farmland', + forest: 'forest', + grave_yard: 'cemetery', + grass: 'grass', + meadow: 'meadow', + military: 'construction', + orchard: 'orchard' + }, + natural: { + beach: 'beach', + sand: 'beach', + scrub: 'scrub', + wetland: 'wetland', + wood: 'forest' + } }; - var patternKeys = ['landuse', 'natural', 'amenity']; - - function setPattern(d) { - for (var i = 0; i < patternKeys.length; i++) { - if (d.tags.building && d.tags.building !== 'no') continue; + // Skip pattern filling if this is a building (buildings don't get patterns applied) + if (d.tags.building && d.tags.building !== 'no') { + this.style.fill = this.style.stroke = ''; + return; + } - if (patterns.hasOwnProperty(d.tags[patternKeys[i]])) { - this.style.fill = this.style.stroke = 'url("#pattern-' + patterns[d.tags[patternKeys[i]]] + '")'; - return; + for (var tag in patterns) { + var value = d.tags[tag]; + if (value) { + var pattern = patterns[tag][value]; + if (pattern) { + this.style.fill = this.style.stroke = 'url("#pattern-' + pattern + '")'; + return; + } } } + this.style.fill = this.style.stroke = ''; } From 1f6828a24f533f74f625c112def8ee1c248e0c2a Mon Sep 17 00:00:00 2001 From: RudyTheDev Date: Fri, 16 Nov 2018 01:04:29 +0200 Subject: [PATCH 2/6] Further change fill pattern definitions to allow iterating over "rules" --- modules/svg/areas.js | 56 +++++++++++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/modules/svg/areas.js b/modules/svg/areas.js index 368ff4331..3dc39eea2 100644 --- a/modules/svg/areas.js +++ b/modules/svg/areas.js @@ -11,24 +11,25 @@ export function svgAreas(projection, context) { // Patterns only work in Firefox when set directly on element. // (This is not a bug: https://bugzilla.mozilla.org/show_bug.cgi?id=750632) var patterns = { + // tag - value - rules (pattern) landuse: { - cemetery: 'cemetery', - construction: 'construction', - farm: 'farmland', - farmland: 'farmland', - forest: 'forest', - grave_yard: 'cemetery', - grass: 'grass', - meadow: 'meadow', - military: 'construction', - orchard: 'orchard' + cemetery: [ { pattern: 'cemetery' } ], + construction: [ { pattern: 'construction' } ], + farm: [ { pattern: 'farmland' } ], + farmland: [ { pattern: 'farmland' } ], + forest: [ { pattern: 'forest' } ], + grave_yard: [ { pattern: 'cemetery' } ], + grass: [ { pattern: 'grass' } ], + meadow: [ { pattern: 'meadow' } ], + military: [ { pattern: 'construction' } ], + orchard: [ { pattern: 'orchard' } ] }, natural: { - beach: 'beach', - sand: 'beach', - scrub: 'scrub', - wetland: 'wetland', - wood: 'forest' + beach: [ { pattern: 'beach' } ], + sand: [ { pattern: 'beach' } ], + scrub: [ { pattern: 'scrub' } ], + wetland: [ { pattern: 'wetland' } ], + wood: [ { pattern: 'forest' } ] } }; @@ -39,13 +40,24 @@ export function svgAreas(projection, context) { return; } - for (var tag in patterns) { - var value = d.tags[tag]; - if (value) { - var pattern = patterns[tag][value]; - if (pattern) { - this.style.fill = this.style.stroke = 'url("#pattern-' + pattern + '")'; - return; + for (var p in patterns) { // this iterates over potential tag values + if (patterns.hasOwnProperty(p)) { + var value = d.tags[p]; + if (value) { + var rules = patterns[p]; + for (var r in rules) { // this iterates over potential tag values + if (rules.hasOwnProperty(r)) { + if (value === r) { + var cases = rules[r]; + for (var c in cases) { // this iterates over rules for a tag-value pair + var match = cases[c]; + // todo: no checks yet -- first case is good to go + this.style.fill = this.style.stroke = 'url("#pattern-' + match.pattern + '")'; + return; + } + } + } + } } } } From 99ace5c79181c93e059f049ea1cf4c422d60515f Mon Sep 17 00:00:00 2001 From: RudyTheDev Date: Fri, 16 Nov 2018 02:22:18 +0200 Subject: [PATCH 3/6] Expand fill pattern definitions with optional tag-value pair requirement; add forest/wood broadleaved, needleleaved and leafless patterns using the new rules --- css/25_areas.css | 3 ++ dist/img/pattern/forest.png | Bin 18019 -> 18289 bytes dist/img/pattern/forest_broadleaved.png | Bin 0 -> 18182 bytes dist/img/pattern/forest_leafless.png | Bin 0 -> 18305 bytes dist/img/pattern/forest_needleleaved.png | Bin 0 -> 18210 bytes modules/svg/areas.js | 34 +++++++++++++++++++---- modules/svg/defs.js | 3 ++ 7 files changed, 35 insertions(+), 5 deletions(-) create mode 100644 dist/img/pattern/forest_broadleaved.png create mode 100644 dist/img/pattern/forest_leafless.png create mode 100644 dist/img/pattern/forest_needleleaved.png diff --git a/css/25_areas.css b/css/25_areas.css index 53b8c384d..2b2abe0c4 100644 --- a/css/25_areas.css +++ b/css/25_areas.css @@ -56,6 +56,9 @@ path.fill.tag-landuse-grass { background-color: rgba(140, 208, 95, 0.3); } .pattern-color-forest, +.pattern-color-forest_broadleaved, +.pattern-color-forest_needleleaved, +.pattern-color-forest_leafless, .pattern-color-wood, .pattern-color-grass { fill: rgba(140, 208, 95, 0.3); diff --git a/dist/img/pattern/forest.png b/dist/img/pattern/forest.png index b7b2d2943dd564a6c4afa9b6398d9b3ac5626576..04c3c0c98cf3878e639ec1c5cae66c6abe569146 100644 GIT binary patch delta 869 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 M&eoo|Y3bho0WuBgLI3~& literal 0 HcmV?d00001 diff --git a/dist/img/pattern/forest_leafless.png b/dist/img/pattern/forest_leafless.png new file mode 100644 index 0000000000000000000000000000000000000000..5f909ecd2a9490bcbc220859b96f3a12eb174223 GIT binary patch literal 18305 zcmeI4e~cVe9l+-}Fy$_dG*q$tVTNsMtnKXl+S&P$y)EVT%3WmJ%k@aFCTM48-rNnh zJG0Ep-R)gMQbDnrrd2T(vA_WaZ7OPNYoZlRV<3&cqQpccrop5EX_|l$VhAd}*_nMi zyEj`NTs0|qm)`BSZ@%B}oA2lQ-uM0ZW4}1Q>-Mz+HxE!0wRUW@Gyy;9@ORAz;9q}f z>2>&VeSLJFPf>$6hQEE(!^b{CQ6qn~C#Qm`@*SGt*0Q?kRzS8F; zbOlV?&QRvnGe6JJwmFp9E0wu&eHhHxqe~vxv$Si{Sei9dGqb%oP-tk-K@9{t-KbR^ zUuz6yntnAXhs|t;ZmI;cLzx|6hxAl=oE~;PKug&?WALIv%W9UFR7J>bqXmx7vz*HE zIfmmkPSrS`j(;-60Vowb)6ynNJLB%)|AsO%K~UFNc41*5yC7y=Z<^&*Rb@GW6$A!q zF#e(w=ncm4H%3lceoDYMJi8v)u0w}@^@=+e3}rH5N9ZSxt5!!HIeyFzQe+!?o#nF} zn`UGh$fiE$RhzG78Z4-S8gK$1+VQD&^%*yC{Ta7Mm*{cNj$uy9Wz=`-`_^iyUHiev zJVX#9O||qV7wdqX0KPlt8DL}{hO#j&dOw%|?d)Kv$^{^zd*vJZ1Xhdu_*b7yK;+w%epVaN6ELNe@5~ zS}F|BGrTm(OIq{aR!-13F5x87?DA1|P1{=R^pT&0raTYbBz+__yM4fkXzGEEJ{RGo$7>NjCBY zHmm~BMf<(tu@SeYySDOqfzRax2B@MCyH*X0QFvJu6pPR2B|hDC)Y=(LlGNo;gd?n6 z*2Ww^&>^X@QV}*}Z5Xs+$^uX-DkE{C%5Zv4Vk#gfGHTx7I9|dCXTv2&uO@WDSWFlTP*f9e988v;;}|QS(;1yN zU}$pA63twm)7!D6xLMKFs2vWe#m)>jhtwW$PiJd;NHrISy6*WPEPX?nR_#NpNi<60 zvC=G|nr?*4O3?@l3NQ<7M{E1FkYyoKuvexN55Wra-hC|00OxWADRR}+>g~jLtzbd- zz>aA+RdH%%B)POpS}7N9b!oHO98;#5W#c~RtzoNOpk zE6s^4c83@SlK|YgE(nq)97EfJ=wvxiuQCSajghdc9t?4LzKl?7U;fTRF5)v;s}|_&>&K0?&Ro z<23P>2orsk#k}g7DJgv3f(siX%a+Q>TsSi;ip7|QRN=)65Cu?arIpOg_KFj2YF4qh ztvYjxDvOF7?o=vbg;7knQ&DmzU}ObUI7?FVf^4iJb1V1Bq^8E(l2zB#cPOJ_rA1}8 zmBK`|x+-hx)f4loXC~emBAQO`p{BksXJ)hq>O4oZ&RHwZ9j!xFwBqj!_bFjPhI8Z{ zju~+K2yaTX1ohUz54W6lnRm>^*t;1Y!h4?m@XpiGt0tVK_2sVi_!sq(;-=kOD-WeM z?!;-Y5MCr{@canRGR>V~5gyoAv?aVXpG}45!0KG{oF@w${9*aWSAsvDXp}-LcE*wfohu}ge za0G%2hZ52uxDW~)f#AZSgmeflgaSt(xNs;T9fAv?z!3;897;%s;6f;Hgv;U@Xn$`D zaNw7pTswRCnyp9H(ra!#`LV^#`;Of8(1kzVc-@O@KK1nD2R5Ag=85Ol zQ{bmZKl+1B!*5QkS?+u7BsDott+U6@A3FZz-_Ns895{IDxyQHl9qYT~eXVxrTbmDj zVeq%x)PFOBx4t}Z_m-EQ{>Rz3DhD6F@afWd{-z^8{`%m#56yDl=FdL(*k`|dtoZCx zFZ|?}r++xL{F}qK_kZrYZ@j$z;61%KGi=f$r~d3%?aA35=d z)8D`4(gQDD`{MFjheonboWJ{(M~m{E8-8`>_w>Ez$`AJc?eInCj=Mhm&udORdC_{K n|N2jC{L}8&UVZ!U_I_&9kM=*ayKX~j6g4)otMt9w_TTqkZipET literal 0 HcmV?d00001 diff --git a/dist/img/pattern/forest_needleleaved.png b/dist/img/pattern/forest_needleleaved.png new file mode 100644 index 0000000000000000000000000000000000000000..8e4b2fb5163d30603d8cda6f89b09a76bf9bc595 GIT binary patch literal 18210 zcmeI4e~cVe9l)oxkn;p$vBAb@9G8?RbasC2?9NQ~wmojI+>zT_?oPTFHSl)k&EBND zGwaOU?e>fY@dqI>(GzJZAto58(8M2&N*XZfS*2(UMxy}(35xzfL?e|zQ~s#>W_IW8 z?A~s9umn@{Hg~t*d++;W-sd~-JM*1C=I#UgZ@O~)1LF+CTsb>aoJZem_&atv`s=T) zy^6lx-I!VO8Rk9j3xBsT_uapfVWz)gFP4LHX-+rXdK#E+1*Ti|2GVAj{GL_=7>8iM zR$$e3CQ>gyek#S<=0xhCQW8pyDY$IUta)%@ZU3UNcF54o)Skk4zNI4vbr=A)Rj)a| z-kL~7esv^=!+eU3RDwejsmU-PTP_`7r(6%RN;=CKqO7txEiEdVDrI)Fk|1VzLF2^? zCy2VB>4M01KB>YulJcHu>GQ>Xop9*CiPUlsG<2SCHk;|DoOZn`FKU{`3lc9$9Ma(Y z!%hHNoa0~Hb`tw3Lf`Q0Mqs-R8~OzmcO{rerNTh?(^*%&fde^yhaIBGw?Kmz(*i%p z$TYA`W5ugQhh`c)tid{T0w39l1MM2iZs7XM?vRjpdT3yjlTr!C9(cU<`oPeBFujTp zbdV0T^cN2|AU_X%cf~W{^eS4)wS!jg2lKF-9RgQKeW0Vjwubl#XNE$6EqjPrIMX(Z z&Z%~)^9Y(gYC+K%Zq{g37Oev|Hr)Aa_6AbEakL+S-D(SM8^pVi)_klK|2?9XmC8?Y6 zV;Z{UdUX&K>^i7IzTs5!e0MORiBC^`%B{H`IxJX_^ZcOUfmTJ=SPA#Xq+>uICBsi7 z38gBk05^ha?`S+xvkUF|W4eZI>fN9)3!nx;j)SVHp-e!Pt5}-FL5MP=WdtQ>Wb=Gj z1(1vGafN=P(cXy3$r}iBiBO~4l;7i5H${Jvea3)W>}mm<}^vQ#B5d(<3I^# zn*x2@v(a?{)Dk-3T1>PSsA?t@1Vj{M1kTE400%@v7-8)%7~!smW}fdE?H*RY znY}rkWC+^+6XwHXG?$@sv8vH_6=@B3;=5MR1Rk8MqWwft(Ar*m&HCLB-X(}pv@>h= z2#N5)>S$>Y#atx=D&dU<)Hp4dF}QG_aX=PjSu`>^Lq)r4v@}SHE@k7w`@c&=2)rHL zSO!iNngu>ySv>F#X3lV(Rp`B$O@y{8KzE1`)pyHt>ny&kuz|~hMx$mMAl#k&s$+KU zw{SI&7n<<#4zAUNp8aOd)5K9?Ozb7L=8<=%qKa8d01}tWSsIrU!kt-BEzUHQiYQm0 zEWt{g*0)+9>CTLE?i{{E3-9ti<>5=`%Sx+pK$D;Aa$bk4JWL^M^f$QB@5^=EG%RdMMj-U|8T#>0lNij z<)V$Am-t~PE2Bt}P5;C|!=+({iHVM3d)p))m_~_dkD|x1=t(e-9|b3JhCAoCU+Avr z?e~p6(jXWGi9m6YP{KMC7e+xMP+TOGunxtAQIH4}7YQY-LvdjgBm%`nLJ8|oTo?t3 zKyi^!!a5WeMnNJ_TqKmR4#kC0kO&kP2_>vUabXlB0>wo_3F}Z?7zK$yagk8MIusX1 zK_XCGB$TiY#f4Fj2ox6yC9FenVH6|+#YI91>rh-61&Kg$kx;@q6cxO^rH;(e)k)(3f+y-~uk>4Dz9{kCV(+_Sx z`O^3N*Pba{{{o{v(me6lj&ELe)obUz_L%Vbd$zvb{P_=FsV?t7cJm+4oY}K}=Z+&| zSKW1AIi*f3-`bVmcC>u@hONKay{?T3C%$ykwz=Ied}QMnSC^i8_;=4g^U0;tfBi5T ruI`$v-2L=(C+^+#@BG;hGEe%S{^fJ)3lrg6Y-XqT7r%ew?RWkchDZOt literal 0 HcmV?d00001 diff --git a/modules/svg/areas.js b/modules/svg/areas.js index 3dc39eea2..7e1e0af1c 100644 --- a/modules/svg/areas.js +++ b/modules/svg/areas.js @@ -17,7 +17,12 @@ export function svgAreas(projection, context) { construction: [ { pattern: 'construction' } ], farm: [ { pattern: 'farmland' } ], farmland: [ { pattern: 'farmland' } ], - forest: [ { pattern: 'forest' } ], + forest: [ + { leaf_type: 'broadleaved', pattern: 'forest_broadleaved' }, + { leaf_type: 'needleleaved', pattern: 'forest_needleleaved' }, + { leaf_type: 'leafless', pattern: 'forest_leafless' }, + { pattern: 'forest' } + ], grave_yard: [ { pattern: 'cemetery' } ], grass: [ { pattern: 'grass' } ], meadow: [ { pattern: 'meadow' } ], @@ -29,7 +34,12 @@ export function svgAreas(projection, context) { sand: [ { pattern: 'beach' } ], scrub: [ { pattern: 'scrub' } ], wetland: [ { pattern: 'wetland' } ], - wood: [ { pattern: 'forest' } ] + wood: [ + { leaf_type: 'broadleaved', pattern: 'forest_broadleaved' }, + { leaf_type: 'needleleaved', pattern: 'forest_needleleaved' }, + { leaf_type: 'leafless', pattern: 'forest_leafless' }, + { pattern: 'forest' } + ] } }; @@ -51,9 +61,23 @@ export function svgAreas(projection, context) { var cases = rules[r]; for (var c in cases) { // this iterates over rules for a tag-value pair var match = cases[c]; - // todo: no checks yet -- first case is good to go - this.style.fill = this.style.stroke = 'url("#pattern-' + match.pattern + '")'; - return; + + var matched = true; + for (var m in match) { // this iterates over any additional rules for a tag-value pair + if (m !== 'pattern' && match.hasOwnProperty(m)) { + // The only rule is a required tag-value pair + var v = d.tags[m]; + if (!v || v !== match[m]) { + matched = false; + break; + } + } + } + + if (matched) { + this.style.fill = this.style.stroke = 'url("#pattern-' + match.pattern + '")'; + return; + } } } } diff --git a/modules/svg/defs.js b/modules/svg/defs.js index da42f492a..e81b7f8c8 100644 --- a/modules/svg/defs.js +++ b/modules/svg/defs.js @@ -82,6 +82,9 @@ export function svgDefs(context) { ['meadow', 'grass'], ['grass', 'grass'], ['forest', 'forest'], + ['forest_broadleaved', 'forest_broadleaved'], + ['forest_needleleaved', 'forest_needleleaved'], + ['forest_leafless', 'forest_leafless'], ['wood', 'forest'] ]) .enter() From 1e51d5ff23d3ff91cbfd466832a85992c06fde0a Mon Sep 17 00:00:00 2001 From: RudyTheDev Date: Fri, 16 Nov 2018 12:51:31 +0200 Subject: [PATCH 4/6] Add new wetland fill patterns; clean up pattern selection code --- css/25_areas.css | 6 ++- dist/img/pattern/bushes.png | Bin 0 -> 137 bytes dist/img/pattern/wetland.png | Bin 137 -> 17490 bytes dist/img/pattern/wetland_bog.png | Bin 0 -> 17656 bytes dist/img/pattern/wetland_marsh.png | Bin 0 -> 17542 bytes dist/img/pattern/wetland_reedbed.png | Bin 0 -> 17771 bytes dist/img/pattern/wetland_swamp.png | Bin 0 -> 17644 bytes modules/svg/areas.js | 63 ++++++++++++++++----------- modules/svg/defs.js | 9 ++-- 9 files changed, 48 insertions(+), 30 deletions(-) create mode 100644 dist/img/pattern/bushes.png create mode 100644 dist/img/pattern/wetland_bog.png create mode 100644 dist/img/pattern/wetland_marsh.png create mode 100644 dist/img/pattern/wetland_reedbed.png create mode 100644 dist/img/pattern/wetland_swamp.png diff --git a/css/25_areas.css b/css/25_areas.css index 2b2abe0c4..85f886bef 100644 --- a/css/25_areas.css +++ b/css/25_areas.css @@ -199,7 +199,11 @@ path.fill.tag-power-plant { } /* Teal things */ -.pattern-color-wetland { +.pattern-color-wetland, +.pattern-color-wetland_marsh, +.pattern-color-wetland_swamp, +.pattern-color-wetland_bog, +.pattern-color-wetland_reedbed { fill: rgba(153, 225, 170, 0.3); } path.stroke.tag-natural-wetland { diff --git a/dist/img/pattern/bushes.png b/dist/img/pattern/bushes.png new file mode 100644 index 0000000000000000000000000000000000000000..c9df1a23de5d8f38fcbb425305c837ac85539bd2 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ08bakkP61P*BIFjI0!gjoRg?$ z#I8~FKYDA#hBb`7EB{N}aAoRfaD1H{cH?V|EZ3D^^`W_{H5L6+3#@ANAEs2SKkzb& kfx(P*c9ZYHWe4Wp>E_^#SNxu_4rn%mr>mdKI;Vst03XpX0RR91 literal 0 HcmV?d00001 diff --git a/dist/img/pattern/wetland.png b/dist/img/pattern/wetland.png index c9df1a23de5d8f38fcbb425305c837ac85539bd2..41be0c436ae8e4f8019c6313e4fd53e168541c12 100644 GIT binary patch literal 17490 zcmeHPU5Fdk6&};pbv8AaI@C#M$W%@t!JeHT&5vd($#qui?3&22*X!>3DY=@tvpZOt zQD$aW@;?EX=mNt+O@{o{*7y>SoLR)B|bzfTO&rACda4Dpv0VnjKJ@Y4x zv?E8iTelRhU?uIHbG~!$cfNb>nR(DRPM&yZ@66pZ48!bQTxcx8Cma3k*$wZ(*478` zaa(ucY``$L?~nd=G2i<3oeVQ~ud}=wt~MVwOs_MGEU$%U`<*UWGfeeJzl+RsIAmLR z&2ej`_pko2#5z{3w4yYHW_J#+I}2MrKD~8f+1xs3>Q?DUeWuzs0HA|I#P&OFH!%9O zQjBZB_h^_ev9U>bu2wo41!Py7C)qjA$E-4|a;8|Wu$n$ADtbkd53`aWs=T1{qRa`R zA?Su6vgxZ-pMh^x-?ELR#<4UU{8uZjhhf*?`ChL#+bhp{{u(dpy3Pv{FG(C&aKU*u zM19T;4kjQOP6G#~?{q`QbJ++NwY-h6Rw_k-2CsBoo$erz8>HL;i+mq-d2v?Yi<~TT z;M3jk+ws&algDk`!EP9UpIGSEUH3vSSobD`99*6l7;@5V4q_M1x6>&M9fb3nKtW1r zp=YpszKi)K9C#bPiRU+ADF=&IAB0PIn4Kx0z`PJBbnFQ@(UplL;J!1#ExMAp#hOY| zT?NvNIUl3Y^OrrZT~FkCGRp-!Hy6oMWA9&aT+8bP4^;Vam!WWmXt;qwTnEnzCyJaX zEsGUH(hmueAqY8y#B2|Qc)-d07*Q)$*FlRZ?rZMNWJs+lp>*Xq6G+gM_@XU>9a~yR|96%<5T!tV|@%DcZ zt&NUm7urreDL$5GI+igEidBSlj5H2cEFIE-D_qOgZ4P5di!KX_W~x;_Dggj7oL4H0 zbi5eaR#i!qWr@RjSxTXG)8;Corb`uDR8>VRhE7ID7n5h|W>iG-YBr5UHwY0hwb-b` zz^ns{mPJi9RhR&h^$MqoGJF%n7H78vT-KC|pb1tiyHWSyqEqNBIzSgMTrta{rpW>< zyrLxwM*`Bh7DBR6Q7mlhgFrd3ZGj%~9XM}LJ7*KE#e%i8^a>IM5y+Gzi)%rm0NqqL z4dXI46TPf1vYs_j=dtL_j+%B* z-^X-qa7e*jr;%el>!YVFr(^CTCq{~HrS~*xmp*-Gn@ld}UWD%Lw0};b6u=ClWz08* z1n1i2YIGZJKm!i_VB8ng;f`n9SPm_|wi-3k?Txrm)+7O5ycoTwuKCO3u4ixVn!h~m zI`ll_I$<47#CS4e!#S_$SwV6ydm5gP;kv3QWu?lG5087Cbo#ix+Hl}rHi&Ko$`C2` z8NX2Icy^Lw?n3IAY?R!StT-{rC_E>FM|Aw)8C@=C$u7Gk@52?{68Hp^1|cGs(naYa zVt~k)s*BP^!~l^oRTrg;hyfyFsxC?w5d%cVR9%!VA_jdtqWm-b)z+I`jIFRw6* zfBW%$zx?pFclYnP@`+uq{9?ZG-orOuw0`iN*M9S(JZ`$NL3?b^&G z=brU9pI(_ie24MOsa?NzUOzE+=;9xry!P1(H?H0P&QGuZb>`wf#Jm19|H_Y4<~Vxv W(4~#{--d}Zi}NQMZ$9|glm7z!P!q=h delta 109 zcmV-z0FwXGhyjTKkR)YLNklwOFvM0Zpm@7}!Mu zh=4)sV^-MpTpbG3`hQhzC46{~m2f(IFX3c(ufXYA001@xn}SWjrof-viwF&0A@^vm P00000NkvXXu0mjf%G51+ diff --git a/dist/img/pattern/wetland_bog.png b/dist/img/pattern/wetland_bog.png new file mode 100644 index 0000000000000000000000000000000000000000..c0c70ba7c4886c730c9de0ffcccb0250e1062d44 GIT binary patch literal 17656 zcmeHPYiu0V6&^%**fat{QV@NOHdJz?NVtjw39*DC6t(mZMdGEP078INN+l3VRSI`ryR+-r zWN+P2A>Ea{yS{VIckcbpch5aDKlWFfH{Gzh|H^)XAXbl!md4>H>Hl4LK74oQ=RbxY zef808EfO5X5lRoS5_`%NrHVu4Pr-u7GT#R)^LEQMk5ISG8ThBP(Fa zv<5T(c=l+9H1)yERK>%(B$9G!Q-mibK++Wam})-%@@`wI;P0@Q$~l8su`a+Stl zCcstTcYm19kb#M}YcMn92P7xUo5^9@0i>9fD2?UwWKPbqqMYZ1?~@$EN;D(WtUxiW z!pI84lF=(u?1$e9j&3O9r43Oy_}^e=+VkoPP0!8EW#{;;?M%_EEXy>*(HuuX3(DPX zd1`~Q-1Q+yj8g)x=9qQQv@O!dRV((4H<-!zfts&qUA1~MkmW|)K^EzTTBq48L#H|E zTGOXK<5YvG=^72Hpav|@g??VR z!c-R^Y09tzRL^!MY`a!|bpVuY-86Q$14t7rr?8?Tv|%JHJ2Buc)KyRI2_fNFv~)Xn!Y}Fx638a=N9mj_R*F;gJY(y zIxg^w=wK$UqRn$Dlw2gdpcpHv<{wZ+%`Z&=vd}i#npV@Z5E_`v)7hK6mbrJ2F*gmY zuB9!+2~4^pxVGWVsSX&Lf}6gVk{hD7yLG~+Z;}5^7Hn%4I4F65*;ZjE1YjvM9J@v~ zD=6vNq*||6O-=O^OwU?+)K@eMSDfqw#+SHOSDjs%-dJAX^F|Kt>I%bCf+6JmvJ0r3 zCgv(CD^@h25-%|!*UlySiA#v7d6dGFkX1xU;h6X|O;~jYY1d8Ux)mih3cV=%bS-73>&J3HPu+p}- zWpOvTyp4-{)=-@r{4?9{xS{&a(6zxs3f{sh3D)C2y4P~r;of#)MCf{SgA{e?z27y2 zlS{a#q1!9%pTj6AFs*1Y^Q9KSiFUc*-_t9w0f+ry&=(cq?bEWc1X^%y(r=`zGeM)A z;~4m&S^qt9O&rNOj!S%`tHyatt?0;;~qem~a$6bc4_P=;i~zM9#up zc2?e7D>^IiAt(-lL@uTa(}lzUk}*~nrVEJyBx9^DOcxRZNXA%Qm@Xs+kc_dqFkMIt zAQ@wIVY-kQKr+Va!gL`qfMkr-h3P_K0Ld7u3)6+f0Fp6Q7p4n|0VHFrE=(5^14zbL zU6?K;29S)gx-eZx3?La}bz!=Y7(g<{>cVs(F@R)@)rILoVgSh)s|(YG!~l{pRu`rV zi2)>ItS(F!5(7xar&U*f>nAjT1%EeV4*o#K(5Vym!ynfmwbAi1LCk-bAQo;Xh*O`# z&-V#ph9QU#b`pg05J6mS|9Z!<4Fqw{`D3M_iNan>+P?^C<3`x^_#esS_Q+lXrEs-dH|l7Bk4{uX#rS##4BeF^hY0iZRDr+ zr%SopK6-rbyH}T&2JXD^;D^MIUVQbRzrS$Rop%o~Pw)EWb=kw^O9vJgckti-BSR2y#FshUVGEPE#uQa-!D(D-F|4zfybPo<2x_i zxBbaa_OAL+dXpNN*ucE-=Y5MOR^9f^t2W;E_>~7U|wK=)wrF{cgt%_5N%r z@v9>_9_CAIq7tpmmgeFK*_GBYcHRphtCXvpDatBa)5@ZvsZ!-WRuaT2FKE12;RI0^ zG+hwc>{DvYAgLZ$w!YLnl1+#Hn=P$Ik+1W7uh%R0mjr{_{TaRW-rFf#jCtFw7A57$i89PLg?*pF~%K~3yWSIjS ze?90Vr)HTv?7%K`qY&ANg?9d`7kS~TH(|=b;fWKYn6z4hxeL#?+bx_rj1F%g1R2so z%W!$qhx`%@z4gF^hd0nt4i&9FjF#XqI#akp>V=LX$DZIPJ~9yk>^l?8;v=b9l2d7@ z>j;`YA3zX!!LsLd8fm&7%VWXL&&TOmWA8cPxR%!o@2&IWCd0%TdV@_6!3MHaIZ@<9 zX<1ZtN&BE6>4JcHNY%z1v^>kPH%A>*mqlb+)ddCjfoYEWKv$s!A~2N~To?0WnY!%- zT@W>#E@(sEciVM-IEZNua#Nr8I$nTI3pV6BUo>23)%48u_~MvzO&Fp`gjj@7oRZ7` z0ni>D%@1^(Mp}F<&vYz(I4P_Gs6kNUplWF-3{d3^TeCR`QCPH!pw!H2osUZZaxpxw zEHSe2V%K)HDv6bf#6eA#GS`}EbE;U=B-IwHRYfdzosNz!1}Akr6mfdBTKb|JMgWmo zY&Ot9*+GjoRa3Mos>Y$yvN_AFXq;inDDf0%$UuU2O@>L@jhYV^ow?3uN3M$(F4t5+ z1~rHluGZ3p0|B7f0H_G6VnJK8@`*5K+a`J_aL|4OI+#wp77MM#&{QA_Xc?*`S)73a zg}j>zSA$T7rczOC6XjNlqQK3zsTQ0#r8Y++oTSuo_~_{9Fr|{6!3RMIl>cEWml!h5s6No5`j1Et0U|CNUobBP94#76_$#e8pp*yh}rG65X$sR(_ zj(Q+~b8U2;PE#dQucKz;?u##x8xsZ3-GISci35r@K+Ow8)yEFJE;}fCY~-=P_dAXW z;sEm-u9dX{gIbdZ8}spBTx$q6c9w6VT#;2fzN!sD<|=lj7FSBh)l8*k08uf_ijgl7 zOV{xw#(~3Vg~86!%rUV^P5u8_^Nz2~=~^;+We(b*xH2c*_-I>}w|d*#xV&dg zv-3#2XU9!D%05EZhBhg5*QsOmFz=(MEvIAVBRfXs-OBE1vMzo4&Ne+c%)H3Ex6}SP zou$CdaJHO$a|jq~m+SFuxQ-fd)DI?oQ3KuaY#YP8CC66cM!K_}G|Dx!K?wpc#^0GK zet6vUMQ!{eqy%a6KF)R3~-#)dJg_*p@EFMAw4AA^mmqR2{}A0HmKIOg9_AMMQ)vP+T|-qD*lS z5#b6H7fypHQ(QzuxB|t6(;&(e7ZDMzKyl$Th%&`RM1(6)TsRG)OmPtr;R+NNPJ<{@ zTtq~;0>y>XAj%XM5fQFHap5$GGQ~wigey>7I1QpqaS;*W3KSPkgD6v6L`1j(#f8%# z$`lt75w1XS;WUUc#YIGfD^OfG4WdkO5fR}E6cGzbam@_hdI4SZs*4_ar^OS0{Qk$#`!HB@VX4J1TOVMUGiMp*>Oax%WrkT780OW} z45L5EFz@z0|HvyxknW!rn{&(k-@JC>;(@cmJHPS#EoWZb%inzInP2wKeD6DZUuC}V z!qd$!KeqOcA6~x8Kls@_kB6P7)Z5D|l&1Xi&0PyWzIOYCTQ7X; zO8KTsyMEig<;~q!cVAgKG*@PW_x$0Bs~ZPDx93Ot`}W`T=CdbHeftML{fcqwjc2bO z{N26_=hwpn7fxTh9G!aU*H^xN=SPBT-~8FRUmWy*|M5r9zP#t|mtMD@+kceVc=*%1 zFa6zZuAMS|a@%Lh0-Skh--BQL^CNeyzVfMa_kNdoQr`QFcjT-4?`xlZ?6t<7{ePVQ k(!-?}KYT~|Vw?Gkxbd}5JimkhFwElNqs$=BLDyZ literal 0 HcmV?d00001 diff --git a/dist/img/pattern/wetland_reedbed.png b/dist/img/pattern/wetland_reedbed.png new file mode 100644 index 0000000000000000000000000000000000000000..19a61fe79305db1a295f75fd8f91b863d8066847 GIT binary patch literal 17771 zcmeHPe{3699lthEx~y9Z19he9baRWej-Ky_@6NuP<1MihlB~|M#A7L|wmjdxbB@|R z1-a9<>p36Gl*-25I#%`RrI$z%m(PPiL;|C(Cr4K$CATz+$us^3d)Sehaz-X3G$K>5yUOD!0|H6DJ(BC z9ItYU%JFpN6^M1BzoJFmP)8Ddm2l|4uE2!j6jYX-o}La)hk{ly!}5xvu$;gO0)s3V zdnWII5|g(#dLUJt1hloHS#V4%PrJAvZB05|fq)yR_NuHaSEvQb+ZFB*i);xLSU$+H zt(D1ddfqSyndY$#uAz3pyTmyg;Pg^3E;pO z@{BM%&+tNukEnw3Zcb1+&WGTcH31|o-85zz0pt`fsJw`N{1`sVW(>3ob>M(Sq4;fm zIJ%}9Rxt;hn3)3^$QJUMC|e)&S=O|v#;vSXMAL$?P?T*o+|nyyX_M~e=+0}UX&kLy$eJ;)_~@2q>S{eGlmS#A2s1FED<};x!lVtwU?4%i5nXfS|F8%#PPN|Gi?x*h^$4L7>i8LU88qa*0nEK0H=rU9=Z79;LHK?wpJ zP|)gu$VDU_8j4;GOQPBcsL8yMy)#ps3T*~?!g&$}ft?RRV z%oIS;hHeq<3RJ6T?OgICR}o&h7^^^Y52%>tmL`Z;Xc(V!5S22c zXyxcy1*IK}28BY_)PS2{b}Fw|`iffNswUfq@n2l44W^c+H$EhWB1RZ8FwKP+(GbIK z*@aA4lfr1XOKD9^SC{CMYx5G_#QDTjJ4(?>$g7g93S9Lh^jWnBY1GalPWi=1u0BU? z0^~DLkFnL2RR@}9bP-j$XdTubI{C$clW zrpT+bjcr-An_Sq&ReM%Xoqg_^?RMNqeHZB3&>@9xVO1aN)joQ$<+RDY;l!w*>y;a% zN|(O)y9RG^KKEAW)>8XtFG>rTdbBF@i8{f)b~)$%avwZ+H^!srVH=Fe zk`$7nZ1Zrl$FNy~*|CI)Zj5dBRv?5Tm3^8ov~=9o&e3Os25xTG# zz%nN4B6MLffMrb7Md-p}0Lz%Di_nF|0G2UP7oiJ_0W4#pELPSuF@R-E)J5pRVgSpSsEg2r#Q>HuQ5T^LivcWSqAo%g z76VwuL|ud~EC#TQiMj|~SPWnppI2R-^{>!?dGx&*)94E_^6{VUMPIH#YyBfhikf{F zMeV$YqW<;<`aDZflN?3;W}Kqb0~EE^df<+4^ikBZnSn%is&x8SpZeb5GdH|__bD^| z(bRoMS3m#A`Xle%{rgu>JTjj@4KHG`u?5s&vqWzE#JTY z_{VqdSl4Y_wX^rzf6qMq{GPjR-}R61id7RGH@^PIPyXmT55BT}*~^Dc#eV$jb%je_ z?08{JJ8<@&Z`w{BUO#xpzFk)p-n=#S8ecfNd1dg6pMJgP(!cDoe?gU&UB2tOb)EY= z4zBv^FDKp~KSv!;kFU*bNQS=qTXA@9`H8grt^J2P?jCxAPR$Q&SUo(u6+}V9!xcTx;p_lruJ$mxU{%3{9*K|L!b(0{?_dGLx_`v+RlV3gEJOAj__q=rP z=7;Y4Z1~G;@97g;R?cm`cm2*xcQEwCwvUYdVR+Mq$KG+pC!SpU*z!5~gB>6HGZS6@ zrz^Q@hYohc2F;&5IC$(co$H^=X5=s3{l=NcpWJl(^w+<6+c}AnZ#?qahgNU@nfrAp N1HD6ulRe`f{uhcWi8}xQ literal 0 HcmV?d00001 diff --git a/dist/img/pattern/wetland_swamp.png b/dist/img/pattern/wetland_swamp.png new file mode 100644 index 0000000000000000000000000000000000000000..da4a44a93349c7db1ffc21026ba11622120e5591 GIT binary patch literal 17644 zcmeHPe{37o9ltgmYQiEF`UhKK;$~K@h@J1Z&v$cNrE%M2;LxQhBus00zI&HkW8Znc zOYCFSi3`lS88wHKgwcVXcS z`sghVPr4L!;d=jX6?OliPf^s+<<|IwH<7(Y)15*b7)}nxD}^Gmrl{2BN)hNY(4%v3 z%CZMyZ~x?(7;PB?vFqh5mn{y#X=`|)1a~fsj_V6Ex@yEWr~6VB4FMFO2k1&6Z@XG$ zAXdfI(06~BjnP#TZ)PAi=m(@HvODM@rvzy^o?vudOwx)P=Vdi1NME1@j!&?h%JLG! z@fxRU98cF?v2-8$mMR&hHkR2|3y1z2h)sK5QDfP1xg0Nxai=uJ@~Wz`oWKeKgDe<# z-u6I+vE3^IkPs&WUA<%#J473Xk;DN4CqP7tn zL)T2FQ~+MuDu5}-7VW7N+Zc>k*0re(IeDjqE(@l`6x(jNtyjj;XZ_7FXzS2LnQ$W+ zLV2og|1Dsuc{H5JTj`+q7>;fkS|cb-0H{KsFfeJTC=D>l-S4|kT@%GSWA|ddSBrs4Fg&MS~n@o~dR3T~diG<9zhYm)Y7ZYXbTvYh-%4W3@ z+w}lqY9y0J191y2I$`R(EGU2hVnSpRKoXgxt_X}Q3Z|J848ed>Rd&tpjYZd>!{`XQ z{lYmhCvY$U(ZZ8TuyDWumB|4haY@;LrfP(NB4En`U0bryc?0qh8-FbZT1!q%0-oa$ znSx+2Ig}`buFH%9p$K(Zl1&|HE1;qc%(76!mM^LK<_uRQwG)1=d9)#^>d8<9B^Ua2 zZy**HzWPxTsHCQqYW>uJ?w=`X-LEDPvCuTyxU9NoDlo8?r?Wc>mbrJ1QJ#i&$7&Sd zR82Y~xQ^+SK?x2{p?%s-l?+gu-CE(>Z;}5@794vHmT>ZbvJFu40#WrbOHP5V7d_f@ zXizNXEgkp?X6J09)(X^XO_=Nm#(#0GE|^=H-gr?Glcs`pb&eAm$&?hoQbI=2WhDoA zIj2jxaETGQwl2|6TtrOu(+?e9ye20!feR0>h*f8hX6{s)E5JmESw4xxk^2xiLTbv|DQFlcxQIkk_Fp|?98Ak3My@LTNbu@ z%iFlHXARW3%|EmKrX8v8W4bnUNTItD_m>!No<~ z+o3xv?Vp1vZD1PFLgq6Kf+Ov6%D)ZQPy>$o!D?TWMt3~R#v*9dxe33K&d*jGWkul7 zi$w>Oe^0z@y47{^+^*5-R@a8-F5B|bLM>X$aKy`hRuJ6F?nKYWU^*eoqMTw|hg&^% zSQVI`$XMuJ*7a`%L=>s&(>l@Cak7(RWTNI6Y?R28tZHI{QS_V)J)&dl&*&mK3wGIg zd2g)fyub&bBnTF{gf2oC76VwuL|ud~EC#TQiMj|~SPWnp6Lk@~uo%EHCh8(|VKIPZ zOw>i_!eRi+n5c`;g~b4tF;N$x3yT3PW1=oX7Zw9p#zb9&E-VJHjETAkU04iY854C8 zy093)GA8OGbYU@oWlYpX=)z(E%b2K((1pbSmN8Kmp$m%vEMuZBLKhYTSjI$Mgf1)w zu#Abi2whkVU>ToNU44yTy?{3Qsf#lDO^dr8-uMRkJq%hO9?MeH!bXZ(yp^IpIEy}C zr>I$uqTaZXqO|)c>JsO!Juhyfs8!oXGK1rl-@dRkGx|KYZvQid!`G$uKiRwG>9hUo zHVyRNviiHbW~g(l@`e@7`xmPQEJBN2gC+ ze(0X}`M&phiVvKAukVb$_OgBKslVkPi+|(Ge}Ceo6VJZLtUI`Q=|>;+zViCi7f-3X zZz}XtPxXA|TQ6KU!he3>x;t)?KDgOlebp~|9)9etlcR%&J{Mbcc=6h&FS%`h@AJk( zV@F<_UU>V%y=#vA@RhIb&5!jz^4Uv|{{F;h7iD&aKkPtN)mP?)3c+ynC^_<{!t`-uF}{+mGJf(vzn*{^?lH2z&6zCvF?f{Oal_ zuYB$0O~)Txy7M<@Z@+NE_ikX0&1D{WN2LBadF%T5U*~@8{~pQ6*3rzPTW-ANUz7!A A5dZ)H literal 0 HcmV?d00001 diff --git a/modules/svg/areas.js b/modules/svg/areas.js index 7e1e0af1c..77613460c 100644 --- a/modules/svg/areas.js +++ b/modules/svg/areas.js @@ -11,7 +11,11 @@ export function svgAreas(projection, context) { // Patterns only work in Firefox when set directly on element. // (This is not a bug: https://bugzilla.mozilla.org/show_bug.cgi?id=750632) var patterns = { - // tag - value - rules (pattern) + // tag - value - rules (optional tag-values, pattern name) + // (matches earlier rules first, so fallback should be last entry) + amenity: { + grave_yard: [ { pattern: 'cemetery' } ] + }, landuse: { cemetery: [ { pattern: 'cemetery' } ], construction: [ { pattern: 'construction' } ], @@ -31,9 +35,16 @@ export function svgAreas(projection, context) { }, natural: { beach: [ { pattern: 'beach' } ], + grassland: [ { pattern: 'grass' } ], sand: [ { pattern: 'beach' } ], scrub: [ { pattern: 'scrub' } ], - wetland: [ { pattern: 'wetland' } ], + wetland: [ + { wetland: 'marsh', pattern: 'wetland_marsh' }, + { wetland: 'swamp', pattern: 'wetland_swamp' }, + { wetland: 'bog', pattern: 'wetland_bog' }, + { wetland: 'reedbed', pattern: 'wetland_reedbed' }, + { pattern: 'wetland' } + ], wood: [ { leaf_type: 'broadleaved', pattern: 'forest_broadleaved' }, { leaf_type: 'needleleaved', pattern: 'forest_needleleaved' }, @@ -50,34 +61,34 @@ export function svgAreas(projection, context) { return; } - for (var p in patterns) { // this iterates over potential tag values - if (patterns.hasOwnProperty(p)) { - var value = d.tags[p]; - if (value) { - var rules = patterns[p]; - for (var r in rules) { // this iterates over potential tag values - if (rules.hasOwnProperty(r)) { - if (value === r) { - var cases = rules[r]; - for (var c in cases) { // this iterates over rules for a tag-value pair - var match = cases[c]; + for (var tag in patterns) { + if (patterns.hasOwnProperty(tag)) { + var entityValue = d.tags[tag]; + if (entityValue) { - var matched = true; - for (var m in match) { // this iterates over any additional rules for a tag-value pair - if (m !== 'pattern' && match.hasOwnProperty(m)) { - // The only rule is a required tag-value pair - var v = d.tags[m]; - if (!v || v !== match[m]) { - matched = false; - break; - } + var values = patterns[tag]; + for (var value in values) { + if (entityValue === value) { + + var rules = values[value]; + for (var ruleKey in rules) { + var rule = rules[ruleKey]; + + var pass = true; + for (var criterion in rule) { + if (criterion !== 'pattern') { // reserved for pattern name + // The only rule is a required tag-value pair + var v = d.tags[criterion]; + if (!v || v !== rule[criterion]) { + pass = false; + break; } } + } - if (matched) { - this.style.fill = this.style.stroke = 'url("#pattern-' + match.pattern + '")'; - return; - } + if (pass) { + this.style.fill = this.style.stroke = 'url("#pattern-' + rule.pattern + '")'; + return; } } } diff --git a/modules/svg/defs.js b/modules/svg/defs.js index e81b7f8c8..f8a3b1e98 100644 --- a/modules/svg/defs.js +++ b/modules/svg/defs.js @@ -73,7 +73,11 @@ export function svgDefs(context) { .data([ // pattern name, pattern image name ['wetland', 'wetland'], - ['scrub', 'wetland'], + ['wetland_marsh', 'wetland_marsh'], + ['wetland_swamp', 'wetland_swamp'], + ['wetland_bog', 'wetland_bog'], + ['wetland_reedbed', 'wetland_reedbed'], + ['scrub', 'bushes'], ['construction', 'construction'], ['cemetery', 'cemetery'], ['orchard', 'orchard'], @@ -84,8 +88,7 @@ export function svgDefs(context) { ['forest', 'forest'], ['forest_broadleaved', 'forest_broadleaved'], ['forest_needleleaved', 'forest_needleleaved'], - ['forest_leafless', 'forest_leafless'], - ['wood', 'forest'] + ['forest_leafless', 'forest_leafless'] ]) .enter() .append('pattern') From 3e2eaa6635a243379b93a2a1f9586c51725046b6 Mon Sep 17 00:00:00 2001 From: RudyTheDev Date: Fri, 16 Nov 2018 13:34:23 +0200 Subject: [PATCH 5/6] Allow fill pattern definitions to have short-hand syntax when there's only one pattern "rule" --- modules/svg/areas.js | 67 ++++++++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 30 deletions(-) diff --git a/modules/svg/areas.js b/modules/svg/areas.js index 77613460c..bc4968a50 100644 --- a/modules/svg/areas.js +++ b/modules/svg/areas.js @@ -11,33 +11,35 @@ export function svgAreas(projection, context) { // Patterns only work in Firefox when set directly on element. // (This is not a bug: https://bugzilla.mozilla.org/show_bug.cgi?id=750632) var patterns = { + // tag - value - pattern name + // -or- // tag - value - rules (optional tag-values, pattern name) // (matches earlier rules first, so fallback should be last entry) amenity: { - grave_yard: [ { pattern: 'cemetery' } ] + grave_yard: 'cemetery' }, landuse: { - cemetery: [ { pattern: 'cemetery' } ], - construction: [ { pattern: 'construction' } ], - farm: [ { pattern: 'farmland' } ], - farmland: [ { pattern: 'farmland' } ], + cemetery: 'cemetery', + construction: 'construction', + farm: 'farmland', + farmland: 'farmland', forest: [ { leaf_type: 'broadleaved', pattern: 'forest_broadleaved' }, { leaf_type: 'needleleaved', pattern: 'forest_needleleaved' }, { leaf_type: 'leafless', pattern: 'forest_leafless' }, - { pattern: 'forest' } + { pattern: 'forest' } // same as 'leaf_type:mixed' ], - grave_yard: [ { pattern: 'cemetery' } ], - grass: [ { pattern: 'grass' } ], - meadow: [ { pattern: 'meadow' } ], - military: [ { pattern: 'construction' } ], - orchard: [ { pattern: 'orchard' } ] + grave_yard: 'cemetery', + grass: 'grass', + meadow: 'meadow', + military: 'construction', + orchard: 'orchard' }, natural: { - beach: [ { pattern: 'beach' } ], - grassland: [ { pattern: 'grass' } ], - sand: [ { pattern: 'beach' } ], - scrub: [ { pattern: 'scrub' } ], + beach: 'beach', + grassland: 'grass', + sand: 'beach', + scrub: 'scrub', wetland: [ { wetland: 'marsh', pattern: 'wetland_marsh' }, { wetland: 'swamp', pattern: 'wetland_swamp' }, @@ -49,7 +51,7 @@ export function svgAreas(projection, context) { { leaf_type: 'broadleaved', pattern: 'forest_broadleaved' }, { leaf_type: 'needleleaved', pattern: 'forest_needleleaved' }, { leaf_type: 'leafless', pattern: 'forest_leafless' }, - { pattern: 'forest' } + { pattern: 'forest' } // same as 'leaf_type:mixed' ] } }; @@ -71,24 +73,29 @@ export function svgAreas(projection, context) { if (entityValue === value) { var rules = values[value]; - for (var ruleKey in rules) { - var rule = rules[ruleKey]; + if (typeof rules === 'string') { // short syntax - pattern name + this.style.fill = this.style.stroke = 'url("#pattern-' + rules + '")'; + return; + } else { // long syntax - rule array + for (var ruleKey in rules) { + var rule = rules[ruleKey]; - var pass = true; - for (var criterion in rule) { - if (criterion !== 'pattern') { // reserved for pattern name - // The only rule is a required tag-value pair - var v = d.tags[criterion]; - if (!v || v !== rule[criterion]) { - pass = false; - break; + var pass = true; + for (var criterion in rule) { + if (criterion !== 'pattern') { // reserved for pattern name + // The only rule is a required tag-value pair + var v = d.tags[criterion]; + if (!v || v !== rule[criterion]) { + pass = false; + break; + } } } - } - if (pass) { - this.style.fill = this.style.stroke = 'url("#pattern-' + rule.pattern + '")'; - return; + if (pass) { + this.style.fill = this.style.stroke = 'url("#pattern-' + rule.pattern + '")'; + return; + } } } } From 76eeb914958045a6aa91d64435cff857b363839b Mon Sep 17 00:00:00 2001 From: RudyTheDev Date: Fri, 16 Nov 2018 13:47:09 +0200 Subject: [PATCH 6/6] Optimize the new fill pattern PNGs --- dist/img/pattern/forest.png | Bin 18289 -> 396 bytes dist/img/pattern/forest_broadleaved.png | Bin 18182 -> 305 bytes dist/img/pattern/forest_leafless.png | Bin 18305 -> 276 bytes dist/img/pattern/forest_needleleaved.png | Bin 18210 -> 315 bytes dist/img/pattern/grass.png | Bin 17921 -> 207 bytes dist/img/pattern/wetland.png | Bin 17490 -> 182 bytes dist/img/pattern/wetland_bog.png | Bin 17656 -> 246 bytes dist/img/pattern/wetland_marsh.png | Bin 17542 -> 234 bytes dist/img/pattern/wetland_reedbed.png | Bin 17771 -> 396 bytes dist/img/pattern/wetland_swamp.png | Bin 17644 -> 344 bytes 10 files changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/img/pattern/forest.png b/dist/img/pattern/forest.png index 04c3c0c98cf3878e639ec1c5cae66c6abe569146..c3b07b3b7b0e0f80cf6611034aa6a5a8f6f24c58 100644 GIT binary patch literal 396 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dynE^f_u0Z<#|NlUe)(NuMoVqn!pZ}E)GH^6VWE0*u-&}oW%7*Bd^$tc3H>VuPk()~lYb-W!T=KTE%aYVs zT*V;g)6H`%g(1QELYRKzd+tfARtqsoxV!j$RCrhQ;m-MkYXn)&Hher{`HZozZ;m08 tL!q_;Q}xykl?m-K6CA=)g(uwRyQgx1o1<&xo^7De^mO%eS?83{1OVyvWaj_? literal 18289 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 M&eoo|Y3bho0WuBgLI3~& diff --git a/dist/img/pattern/forest_leafless.png b/dist/img/pattern/forest_leafless.png index 5f909ecd2a9490bcbc220859b96f3a12eb174223..d97bc595faa1cf838cfa637d709249179d42fcf4 100644 GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvtpJ}8S0MfW|9>D!5PY3dxfrO3 zuO!GXn1O+v$JXA_$<^J%%iE{K!LtD<)9vZv7*Y{8_u@g$!v-SE0qM-#{u2b74m`NR z+T?zcMRod`Kp%Gv5wCI`PR*L1BC94>h%**td{S@u`C{E|#Z6i&(<~xR#7sKyHFC2< zf+TCh*Sij?53HFlFBAJEw&20s+mR1XWEv<5JQK^3soS9IHZA3#y53DDBYFA8iLDz7 mD(@-?RD?4u`?mAnmF@91oSIw`CfnmdzVdYSb6Mw<&;$S&%TyBp literal 18305 zcmeI4e~cVe9l+-}Fy$_dG*q$tVTNsMtnKXl+S&P$y)EVT%3WmJ%k@aFCTM48-rNnh zJG0Ep-R)gMQbDnrrd2T(vA_WaZ7OPNYoZlRV<3&cqQpccrop5EX_|l$VhAd}*_nMi zyEj`NTs0|qm)`BSZ@%B}oA2lQ-uM0ZW4}1Q>-Mz+HxE!0wRUW@Gyy;9@ORAz;9q}f z>2>&VeSLJFPf>$6hQEE(!^b{CQ6qn~C#Qm`@*SGt*0Q?kRzS8F; zbOlV?&QRvnGe6JJwmFp9E0wu&eHhHxqe~vxv$Si{Sei9dGqb%oP-tk-K@9{t-KbR^ zUuz6yntnAXhs|t;ZmI;cLzx|6hxAl=oE~;PKug&?WALIv%W9UFR7J>bqXmx7vz*HE zIfmmkPSrS`j(;-60Vowb)6ynNJLB%)|AsO%K~UFNc41*5yC7y=Z<^&*Rb@GW6$A!q zF#e(w=ncm4H%3lceoDYMJi8v)u0w}@^@=+e3}rH5N9ZSxt5!!HIeyFzQe+!?o#nF} zn`UGh$fiE$RhzG78Z4-S8gK$1+VQD&^%*yC{Ta7Mm*{cNj$uy9Wz=`-`_^iyUHiev zJVX#9O||qV7wdqX0KPlt8DL}{hO#j&dOw%|?d)Kv$^{^zd*vJZ1Xhdu_*b7yK;+w%epVaN6ELNe@5~ zS}F|BGrTm(OIq{aR!-13F5x87?DA1|P1{=R^pT&0raTYbBz+__yM4fkXzGEEJ{RGo$7>NjCBY zHmm~BMf<(tu@SeYySDOqfzRax2B@MCyH*X0QFvJu6pPR2B|hDC)Y=(LlGNo;gd?n6 z*2Ww^&>^X@QV}*}Z5Xs+$^uX-DkE{C%5Zv4Vk#gfGHTx7I9|dCXTv2&uO@WDSWFlTP*f9e988v;;}|QS(;1yN zU}$pA63twm)7!D6xLMKFs2vWe#m)>jhtwW$PiJd;NHrISy6*WPEPX?nR_#NpNi<60 zvC=G|nr?*4O3?@l3NQ<7M{E1FkYyoKuvexN55Wra-hC|00OxWADRR}+>g~jLtzbd- zz>aA+RdH%%B)POpS}7N9b!oHO98;#5W#c~RtzoNOpk zE6s^4c83@SlK|YgE(nq)97EfJ=wvxiuQCSajghdc9t?4LzKl?7U;fTRF5)v;s}|_&>&K0?&Ro z<23P>2orsk#k}g7DJgv3f(siX%a+Q>TsSi;ip7|QRN=)65Cu?arIpOg_KFj2YF4qh ztvYjxDvOF7?o=vbg;7knQ&DmzU}ObUI7?FVf^4iJb1V1Bq^8E(l2zB#cPOJ_rA1}8 zmBK`|x+-hx)f4loXC~emBAQO`p{BksXJ)hq>O4oZ&RHwZ9j!xFwBqj!_bFjPhI8Z{ zju~+K2yaTX1ohUz54W6lnRm>^*t;1Y!h4?m@XpiGt0tVK_2sVi_!sq(;-=kOD-WeM z?!;-Y5MCr{@canRGR>V~5gyoAv?aVXpG}45!0KG{oF@w${9*aWSAsvDXp}-LcE*wfohu}ge za0G%2hZ52uxDW~)f#AZSgmeflgaSt(xNs;T9fAv?z!3;897;%s;6f;Hgv;U@Xn$`D zaNw7pTswRCnyp9H(ra!#`LV^#`;Of8(1kzVc-@O@KK1nD2R5Ag=85Ol zQ{bmZKl+1B!*5QkS?+u7BsDott+U6@A3FZz-_Ns895{IDxyQHl9qYT~eXVxrTbmDj zVeq%x)PFOBx4t}Z_m-EQ{>Rz3DhD6F@afWd{-z^8{`%m#56yDl=FdL(*k`|dtoZCx zFZ|?}r++xL{F}qK_kZrYZ@j$z;61%KGi=f$r~d3%?aA35=d z)8D`4(gQDD`{MFjheonboWJ{(M~m{E8-8`>_w>Ez$`AJc?eInCj=Mhm&udORdC_{K n|N2jC{L}8&UVZ!U_I_&9kM=*ayKX~j6g4)otMt9w_TTqkZipET diff --git a/dist/img/pattern/forest_needleleaved.png b/dist/img/pattern/forest_needleleaved.png index 8e4b2fb5163d30603d8cda6f89b09a76bf9bc595..cf44434432cd3e6877acf515f0ad118b1dddd6e0 100644 GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy-T^)#uK)l42QsMwuCLiv3^Yix zB*-tAfx*{_m5E(k!o!u{kwxc`4i+noSjcCBfuA5XzT_?oPTFHSl)k&EBND zGwaOU?e>fY@dqI>(GzJZAto58(8M2&N*XZfS*2(UMxy}(35xzfL?e|zQ~s#>W_IW8 z?A~s9umn@{Hg~t*d++;W-sd~-JM*1C=I#UgZ@O~)1LF+CTsb>aoJZem_&atv`s=T) zy^6lx-I!VO8Rk9j3xBsT_uapfVWz)gFP4LHX-+rXdK#E+1*Ti|2GVAj{GL_=7>8iM zR$$e3CQ>gyek#S<=0xhCQW8pyDY$IUta)%@ZU3UNcF54o)Skk4zNI4vbr=A)Rj)a| z-kL~7esv^=!+eU3RDwejsmU-PTP_`7r(6%RN;=CKqO7txEiEdVDrI)Fk|1VzLF2^? zCy2VB>4M01KB>YulJcHu>GQ>Xop9*CiPUlsG<2SCHk;|DoOZn`FKU{`3lc9$9Ma(Y z!%hHNoa0~Hb`tw3Lf`Q0Mqs-R8~OzmcO{rerNTh?(^*%&fde^yhaIBGw?Kmz(*i%p z$TYA`W5ugQhh`c)tid{T0w39l1MM2iZs7XM?vRjpdT3yjlTr!C9(cU<`oPeBFujTp zbdV0T^cN2|AU_X%cf~W{^eS4)wS!jg2lKF-9RgQKeW0Vjwubl#XNE$6EqjPrIMX(Z z&Z%~)^9Y(gYC+K%Zq{g37Oev|Hr)Aa_6AbEakL+S-D(SM8^pVi)_klK|2?9XmC8?Y6 zV;Z{UdUX&K>^i7IzTs5!e0MORiBC^`%B{H`IxJX_^ZcOUfmTJ=SPA#Xq+>uICBsi7 z38gBk05^ha?`S+xvkUF|W4eZI>fN9)3!nx;j)SVHp-e!Pt5}-FL5MP=WdtQ>Wb=Gj z1(1vGafN=P(cXy3$r}iBiBO~4l;7i5H${Jvea3)W>}mm<}^vQ#B5d(<3I^# zn*x2@v(a?{)Dk-3T1>PSsA?t@1Vj{M1kTE400%@v7-8)%7~!smW}fdE?H*RY znY}rkWC+^+6XwHXG?$@sv8vH_6=@B3;=5MR1Rk8MqWwft(Ar*m&HCLB-X(}pv@>h= z2#N5)>S$>Y#atx=D&dU<)Hp4dF}QG_aX=PjSu`>^Lq)r4v@}SHE@k7w`@c&=2)rHL zSO!iNngu>ySv>F#X3lV(Rp`B$O@y{8KzE1`)pyHt>ny&kuz|~hMx$mMAl#k&s$+KU zw{SI&7n<<#4zAUNp8aOd)5K9?Ozb7L=8<=%qKa8d01}tWSsIrU!kt-BEzUHQiYQm0 zEWt{g*0)+9>CTLE?i{{E3-9ti<>5=`%Sx+pK$D;Aa$bk4JWL^M^f$QB@5^=EG%RdMMj-U|8T#>0lNij z<)V$Am-t~PE2Bt}P5;C|!=+({iHVM3d)p))m_~_dkD|x1=t(e-9|b3JhCAoCU+Avr z?e~p6(jXWGi9m6YP{KMC7e+xMP+TOGunxtAQIH4}7YQY-LvdjgBm%`nLJ8|oTo?t3 zKyi^!!a5WeMnNJ_TqKmR4#kC0kO&kP2_>vUabXlB0>wo_3F}Z?7zK$yagk8MIusX1 zK_XCGB$TiY#f4Fj2ox6yC9FenVH6|+#YI91>rh-61&Kg$kx;@q6cxO^rH;(e)k)(3f+y-~uk>4Dz9{kCV(+_Sx z`O^3N*Pba{{{o{v(me6lj&ELe)obUz_L%Vbd$zvb{P_=FsV?t7cJm+4oY}K}=Z+&| zSKW1AIi*f3-`bVmcC>u@hONKay{?T3C%$ykwz=Ied}QMnSC^i8_;=4g^U0;tfBi5T ruI`$v-2L=(C+^+#@BG;hGEe%S{^fJ)3lrg6Y-XqT7r%ew?RWkchDZOt diff --git a/dist/img/pattern/grass.png b/dist/img/pattern/grass.png index bd7445b0cd49b77a63090304cc539e8cdcf600ec..cb0621caef17cd153cc075f6ed33125d2012d411 100644 GIT binary patch delta 192 zcmZqdVLZ<`L86|8nSp_!F(myskm3*U32_C||Ns97k`U08eJKpcVl4^s3ua&tvbGPG z-Mk7Ykmc#(7*Y|pcEUm4h5!!d)AJeb95}*xquxR~%SoyI{lU1n3URKE@MRW8y literal 17921 zcmeI4TWl0n7=Q<20IPTji6SvNZiC`wI+wl7&SZBHyI>n#XiAk5G;((4Y&&6hW}KO} zOXGuROfbGEfe5AvKKP(9>WeX;4`@Jr(CCBV#aPt%0!BkjYLo|pXJ&7Ix4WEbQA2VX z+Wk56U*>%0{QsPP9`?ndtq-s6S=YmH-0H!B{4n|C!{1da$X|bYdX9Wt>kjPnIqteO z;qNl;wVAaXmw(S184X4YkLrd~=|iSd#C_F@OSCyIv$5(TV-F7aA|A8sZ0!6;Ct|#1 zW@9^&1*zcn<8fywjOT1h;>E0UZNB~6qQf+Xvbrb{wk|B2;# zh?Mcnl0KZ@QV&P|myL}Ffvbz+)YMepRJ_me#za}uG*MDSMG=UG;P15qR26K$x8|hb zCy#x@v)sUPY(Dghiq1rkjm5%1&7b=N- zL&RlV!FJ#iJGrBsJMILIKkjr1*}U8}FjFXAH=IWS&JoMBAj^WB9FdcH z^zVL2(Ip8uscE+PC^)87+PlDqs>d}wAwwTPv)udcRY4JaSt&7te^DhJjVIW%WVZ50Gu(!F-Mk^jVfk=7~~r($EAW zWf%lu!W2*{sR@cHnMl$MLp72S#6kg@FL0fAjEOMqi0fK~G981sZ`~G3q?KY^LIO_X zFc3})#gbMMFeYoKC8VTkq#A*Mvju^+c@`<4s0?(%xtJsvPHQHXB;pt)B%zc_AOXo_ zYDqOwikpd)gyN+}hz@QRgc`7XvRn6pT}<|JR3f+Ir{|A0E|jgP)Vav>ahS;2SR<30 zwXs?HLYt@{=*S3*WX=fF1DhFf-e~K#nwE7lYvFP(4nfU7Fz+5?Y8=~_ORt)%NUOUO z-zf!C$ith)$PQUd=GVN=H*0sF5yOW{+4>h2!bg)!TLxKHiwRT=pTJlXG&NxeMJ#Co zip%l1Y$Q}8O|oif%b+B6CDo`<|KBpScCj&z>@jTS#Kz1T1OMU58IC=Py}y%0BvlbP zN@35>l{}}yH|sASI6QLQvSpw!JH<)ctRGC8MXfPW;Nw4>tBF19@9a}>mrYFkRW|1( zXJ#@jr%Do11XV3*f+~fXSxlD%(?}NOcoD}HTx=}sKP`|fGovTf{D<3;S5B2xNyX%R zA}LyeR8q2X>2z8V(kaDMaH>>HU~=4BN=x{+95Z5*~g@j!@bRQiDm~ zuY)I9qw!m8Ic+namy31pq}988?}t+eYZ$4d_cOJwy31IrUppQkDk`4Q#tZ`~ALZa3X|c~f|~ z-Lz%-m~90)r5>$q7+8hxZfY+Uwv+djIG0K$Tz9l^HH7 zBB;P{K^jz<;i4jf3Je#dL6sRUDk7-Ba6uYWnc<=$f(i^5q(PM#E-E6Zz;HntRGHzT zB7zDG7oTz9l^HH7BB;P{K^jz<;i4jf3Je#dL6sRU zDk7-Ba6uYWnc<=$f(i^5q(PM#E-E6Zz;HntRGHzTB7zDG7o?E^(`dWCSN@= zMZRO?t22KX+zantKL?%C%#?!qPVd5+^IB#!%eH^=FRIqp{Hz*C=YA-Z1< z<~NO0zy0O$Pgb9lR%Pzn_Cr?LbjR$a+3bhQFC06x=H}&hztwws;Fa}Xth{IW%2QvS zwQijI;K07?cb}QrUHbj)M^Byqbk~J9XE3*oyRgA6Ja}@~s-ZVl?0+-)({Jn2y=m@^ zZ;#BqzW(LU4}7-uqm5sjy+wB?UYmX4uEWQ_e&^3aH{5>n+}!b%mrgJH_0}hz?42E3 zcJX53_G@wv9ei>8%*@^U?mM4<=GZpjkwNq5THU>F`MFom-7);#!F}UL&;K}k+lJS# q{rIIL->=^F{{B0^ac>%3!98~3w(X-Udda*wZgBI~{JRhBe(o;={hVe1 diff --git a/dist/img/pattern/wetland.png b/dist/img/pattern/wetland.png index 41be0c436ae8e4f8019c6313e4fd53e168541c12..cba67b1f34d60890f68566bbe83a53b101046df8 100644 GIT binary patch delta 167 zcmccA!MKfaf?Q(7)#ZnUF7tFw*Z!i9` z_!N*I>gnPbQW2NT(aMx0$@uI4d?$&7i7)=!OGrq#I7>1)J1g`su(7eFu!U4}^a%d_ zuO7p4kfF;-Vnz_7gwjGq#Q;sVcmM4llnEv%$k#A#;b~_V)N5g4Ncrd!E&7Z70MG^o MPgg&ebxsLQ07O3DY=@tvpZOt zQD$aW@;?EX=mNt+O@{o{*7y>SoLR)B|bzfTO&rACda4Dpv0VnjKJ@Y4x zv?E8iTelRhU?uIHbG~!$cfNb>nR(DRPM&yZ@66pZ48!bQTxcx8Cma3k*$wZ(*478` zaa(ucY``$L?~nd=G2i<3oeVQ~ud}=wt~MVwOs_MGEU$%U`<*UWGfeeJzl+RsIAmLR z&2ej`_pko2#5z{3w4yYHW_J#+I}2MrKD~8f+1xs3>Q?DUeWuzs0HA|I#P&OFH!%9O zQjBZB_h^_ev9U>bu2wo41!Py7C)qjA$E-4|a;8|Wu$n$ADtbkd53`aWs=T1{qRa`R zA?Su6vgxZ-pMh^x-?ELR#<4UU{8uZjhhf*?`ChL#+bhp{{u(dpy3Pv{FG(C&aKU*u zM19T;4kjQOP6G#~?{q`QbJ++NwY-h6Rw_k-2CsBoo$erz8>HL;i+mq-d2v?Yi<~TT z;M3jk+ws&algDk`!EP9UpIGSEUH3vSSobD`99*6l7;@5V4q_M1x6>&M9fb3nKtW1r zp=YpszKi)K9C#bPiRU+ADF=&IAB0PIn4Kx0z`PJBbnFQ@(UplL;J!1#ExMAp#hOY| zT?NvNIUl3Y^OrrZT~FkCGRp-!Hy6oMWA9&aT+8bP4^;Vam!WWmXt;qwTnEnzCyJaX zEsGUH(hmueAqY8y#B2|Qc)-d07*Q)$*FlRZ?rZMNWJs+lp>*Xq6G+gM_@XU>9a~yR|96%<5T!tV|@%DcZ zt&NUm7urreDL$5GI+igEidBSlj5H2cEFIE-D_qOgZ4P5di!KX_W~x;_Dggj7oL4H0 zbi5eaR#i!qWr@RjSxTXG)8;Corb`uDR8>VRhE7ID7n5h|W>iG-YBr5UHwY0hwb-b` zz^ns{mPJi9RhR&h^$MqoGJF%n7H78vT-KC|pb1tiyHWSyqEqNBIzSgMTrta{rpW>< zyrLxwM*`Bh7DBR6Q7mlhgFrd3ZGj%~9XM}LJ7*KE#e%i8^a>IM5y+Gzi)%rm0NqqL z4dXI46TPf1vYs_j=dtL_j+%B* z-^X-qa7e*jr;%el>!YVFr(^CTCq{~HrS~*xmp*-Gn@ld}UWD%Lw0};b6u=ClWz08* z1n1i2YIGZJKm!i_VB8ng;f`n9SPm_|wi-3k?Txrm)+7O5ycoTwuKCO3u4ixVn!h~m zI`ll_I$<47#CS4e!#S_$SwV6ydm5gP;kv3QWu?lG5087Cbo#ix+Hl}rHi&Ko$`C2` z8NX2Icy^Lw?n3IAY?R!StT-{rC_E>FM|Aw)8C@=C$u7Gk@52?{68Hp^1|cGs(naYa zVt~k)s*BP^!~l^oRTrg;hyfyFsxC?w5d%cVR9%!VA_jdtqWm-b)z+I`jIFRw6* zfBW%$zx?pFclYnP@`+uq{9?ZG-orOuw0`iN*M9S(JZ`$NL3?b^&G z=brU9pI(_ie24MOsa?NzUOzE+=;9xry!P1(H?H0P&QGuZb>`wf#Jm19|H_Y4<~Vxv W(4~#{--d}Zi}NQMZ$9|glm7z!P!q=h diff --git a/dist/img/pattern/wetland_bog.png b/dist/img/pattern/wetland_bog.png index c0c70ba7c4886c730c9de0ffcccb0250e1062d44..d2fc598b53247f7656635fdd629227d8f56f3f24 100644 GIT binary patch delta 231 zcmey-$@q zada$Dq}S8MF{C1{_ToX_1_KV(3qs-or40Oh3)saAn%q+Vhb~#5IpJ9ShYz1-FT3BO z=M{M9@eq{c_li{xPvkd`NgEZSQ;%Y zu~6hX*E%d?oB{`n#H&?kusM(RMDup?m|w!p4ZQjDH%HWvuh-E5x}g88$wb U=WHnJ69hTj)78&qol`;+08QIc6aWAK literal 17656 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 diff --git a/dist/img/pattern/wetland_reedbed.png b/dist/img/pattern/wetland_reedbed.png index 19a61fe79305db1a295f75fd8f91b863d8066847..2138dcab2622d0824e2953e4a0e58f912ecee9b6 100644 GIT binary patch literal 396 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy2?0JKu0Z<#|NlUeMqmoZ=k-9N z6-t8qf*BZ?m|0la*f}`4dHDDRg+-+G4UDbr9b8=9+&#R!ef)J&Vt{IQd%8G=RK%^l zd{C%KLB!!=w9ul7Gr0u2{{4^NmNBa{Q*P&rb>|=1GVs~oVqXw`W7_+B32~;yn~XeW z+pP^eeV}F8O+5yKAK{19S4>XYc!`Ihzj(`u0|mSXMGm~!QEsl!oF%Tdo{M3Xa)*Nc zeN*;Nj#C}WN~+TrY+bRBA!pXb*E-Cy*C*eb#IqyESJ;Q~2J6&UGEZ*bsHmH=?LbSx z(Gv&m@3PLD()cO3z|^QAnf1+I3;FMg4Qu{4ym6gc%`~f(r!3^$gD0TS^mO%eS?83{ F1OV4zbp-$b literal 17771 zcmeHPe{3699lthEx~y9Z19he9baRWej-Ky_@6NuP<1MihlB~|M#A7L|wmjdxbB@|R z1-a9<>p36Gl*-25I#%`RrI$z%m(PPiL;|C(Cr4K$CATz+$us^3d)Sehaz-X3G$K>5yUOD!0|H6DJ(BC z9ItYU%JFpN6^M1BzoJFmP)8Ddm2l|4uE2!j6jYX-o}La)hk{ly!}5xvu$;gO0)s3V zdnWII5|g(#dLUJt1hloHS#V4%PrJAvZB05|fq)yR_NuHaSEvQb+ZFB*i);xLSU$+H zt(D1ddfqSyndY$#uAz3pyTmyg;Pg^3E;pO z@{BM%&+tNukEnw3Zcb1+&WGTcH31|o-85zz0pt`fsJw`N{1`sVW(>3ob>M(Sq4;fm zIJ%}9Rxt;hn3)3^$QJUMC|e)&S=O|v#;vSXMAL$?P?T*o+|nyyX_M~e=+0}UX&kLy$eJ;)_~@2q>S{eGlmS#A2s1FED<};x!lVtwU?4%i5nXfS|F8%#PPN|Gi?x*h^$4L7>i8LU88qa*0nEK0H=rU9=Z79;LHK?wpJ zP|)gu$VDU_8j4;GOQPBcsL8yMy)#ps3T*~?!g&$}ft?RRV z%oIS;hHeq<3RJ6T?OgICR}o&h7^^^Y52%>tmL`Z;Xc(V!5S22c zXyxcy1*IK}28BY_)PS2{b}Fw|`iffNswUfq@n2l44W^c+H$EhWB1RZ8FwKP+(GbIK z*@aA4lfr1XOKD9^SC{CMYx5G_#QDTjJ4(?>$g7g93S9Lh^jWnBY1GalPWi=1u0BU? z0^~DLkFnL2RR@}9bP-j$XdTubI{C$clW zrpT+bjcr-An_Sq&ReM%Xoqg_^?RMNqeHZB3&>@9xVO1aN)joQ$<+RDY;l!w*>y;a% zN|(O)y9RG^KKEAW)>8XtFG>rTdbBF@i8{f)b~)$%avwZ+H^!srVH=Fe zk`$7nZ1Zrl$FNy~*|CI)Zj5dBRv?5Tm3^8ov~=9o&e3Os25xTG# zz%nN4B6MLffMrb7Md-p}0Lz%Di_nF|0G2UP7oiJ_0W4#pELPSuF@R-E)J5pRVgSpSsEg2r#Q>HuQ5T^LivcWSqAo%g z76VwuL|ud~EC#TQiMj|~SPWnppI2R-^{>!?dGx&*)94E_^6{VUMPIH#YyBfhikf{F zMeV$YqW<;<`aDZflN?3;W}Kqb0~EE^df<+4^ikBZnSn%is&x8SpZeb5GdH|__bD^| z(bRoMS3m#A`Xle%{rgu>JTjj@4KHG`u?5s&vqWzE#JTY z_{VqdSl4Y_wX^rzf6qMq{GPjR-}R61id7RGH@^PIPyXmT55BT}*~^Dc#eV$jb%je_ z?08{JJ8<@&Z`w{BUO#xpzFk)p-n=#S8ecfNd1dg6pMJgP(!cDoe?gU&UB2tOb)EY= z4zBv^FDKp~KSv!;kFU*bNQS=qTXA@9`H8grt^J2P?jCxAPR$Q&SUo(u6+}V9!xcTx;p_lruJ$mxU{%3{9*K|L!b(0{?_dGLx_`v+RlV3gEJOAj__q=rP z=7;Y4Z1~G;@97g;R?cm`cm2*xcQEwCwvUYdVR+Mq$KG+pC!SpU*z!5~gB>6HGZS6@ zrz^Q@hYohc2F;&5IC$(co$H^=X5=s3{l=NcpWJl(^w+<6+c}AnZ#?qahgNU@nfrAp N1HD6ulRe`f{uhcWi8}xQ diff --git a/dist/img/pattern/wetland_swamp.png b/dist/img/pattern/wetland_swamp.png index da4a44a93349c7db1ffc21026ba11622120e5591..6b7cb4bb5cac5b0ee2ed9fbe3fd57ca92ae451a0 100644 GIT binary patch literal 344 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 A5dZ)H