comparison pkg/geoserver/templates_test.go @ 3826:4b1184fa0326 sld-colors

Added templating and a failing test.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Wed, 03 Jul 2019 17:47:17 +0200
parents
children 885eb90255ff
comparison
equal deleted inserted replaced
3825:36129677ff24 3826:4b1184fa0326
1 // This is Free Software under GNU Affero General Public License v >= 3.0
2 // without warranty, see README.md and license for details.
3 //
4 // SPDX-License-Identifier: AGPL-3.0-or-later
5 // License-Filename: LICENSES/AGPL-3.0.txt
6 //
7 // Copyright (C) 2018 by via donau
8 // – Österreichische Wasserstraßen-Gesellschaft mbH
9 // Software engineering by Intevation GmbH
10 //
11 // Author(s):
12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de>
13
14 package geoserver
15
16 import (
17 "fmt"
18 "strings"
19 "testing"
20 "text/template"
21
22 "github.com/sergi/go-diff/diffmatchpatch"
23 )
24
25 const sldTmplTxt = `<?xml version="1.0" encoding="UTF-8"?>
26 <StyledLayerDescriptor
27 xmlns="http://www.opengis.net/sld"
28 xmlns:se="http://www.opengis.net/se"
29 xmlns:ogc="http://www.opengis.net/ogc"
30 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
31 xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd"
32 version="1.1.0">
33 <NamedLayer>
34 <se:Name>sounding_results_contour_lines</se:Name>
35 <UserStyle>
36 <se:Name>sounding_results_contour_lines</se:Name>
37 <se:FeatureTypeStyle>
38 <se:Name>contour_line_colours</se:Name>
39 <se:Description>
40 <se:Abstract>
41 FeatureTypeStyle defining colour classes for height attribute
42 </se:Abstract>
43 </se:Description>
44 {{ range . -}}
45 {{- if and .HasLow .HasHigh -}}
46 <se:Rule>
47 <se:Name>&#8804; {{ printf "%.1f" .High }}</se:Name>
48 <ogc:Filter>
49 <ogc:And>
50 <ogc:PropertyIsGreaterThan>
51 <ogc:PropertyName>height</ogc:PropertyName>
52 <ogc:Literal>{{.Low}}</ogc:Literal>
53 </ogc:PropertyIsGreaterThan>
54 <ogc:PropertyIsLessThanOrEqualTo>
55 <ogc:PropertyName>height</ogc:PropertyName>
56 <ogc:Literal>{{ printf "%g" .High }}</ogc:Literal>
57 </ogc:PropertyIsLessThanOrEqualTo>
58 </ogc:And>
59 </ogc:Filter>
60 <se:LineSymbolizer>
61 <se:Stroke>
62 <se:SvgParameter name="stroke">{{.Color}}</se:SvgParameter>
63 <se:SvgParameter name="stroke-width">0.5</se:SvgParameter>
64 </se:Stroke>
65 </se:LineSymbolizer>
66 </se:Rule>
67 {{ else if .HasLow -}}
68 <se:Rule>
69 <se:Name>&gt; {{ printf "%.1f" .Low }}</se:Name>
70 <ogc:Filter>
71 <ogc:PropertyIsGreaterThan>
72 <ogc:PropertyName>height</ogc:PropertyName>
73 <ogc:Literal>{{ printf "%g" .Low }}</ogc:Literal>
74 </ogc:PropertyIsGreaterThan>
75 </ogc:Filter>
76 <se:LineSymbolizer>
77 <se:Stroke>
78 <se:SvgParameter name="stroke">{{.Color}}</se:SvgParameter>
79 <se:SvgParameter name="stroke-width">0.5</se:SvgParameter>
80 </se:Stroke>
81 </se:LineSymbolizer>
82 </se:Rule>
83 {{ else if .HasHigh -}}
84 <se:Rule>
85 <se:Name>&#8804; {{ printf "%.1f" .High }}</se:Name>
86 <ogc:Filter>
87 <ogc:PropertyIsLessThanOrEqualTo>
88 <ogc:PropertyName>height</ogc:PropertyName>
89 <ogc:Literal>{{ printf "%g" .High }}</ogc:Literal>
90 </ogc:PropertyIsLessThanOrEqualTo>
91 </ogc:Filter>
92 <se:LineSymbolizer>
93 <se:Stroke>
94 <se:SvgParameter name="stroke">{{.Color}}</se:SvgParameter>
95 <se:SvgParameter name="stroke-width">0.5</se:SvgParameter>
96 </se:Stroke>
97 </se:LineSymbolizer>
98 </se:Rule>
99 {{ end -}}
100 {{ end }}
101 </se:FeatureTypeStyle>
102 <se:FeatureTypeStyle>
103 <se:Name>contour_lines_emph</se:Name>
104 <se:Description>
105 <se:Abstract>
106 FeatureTypeStyle for emphasized contour lines
107 </se:Abstract>
108 </se:Description>
109 <se:Rule>
110 <se:LegendGraphic>
111 <se:Graphic>
112 </se:Graphic>
113 </se:LegendGraphic>
114 <ogc:Filter>
115 <ogc:Or>
116 {{- range . }}
117 {{if .HasHigh -}}
118 <ogc:PropertyIsEqualTo>
119 <ogc:Function name="numberFormat">
120 <ogc:Literal>0.0</ogc:Literal>
121 <ogc:PropertyName>height</ogc:PropertyName>
122 </ogc:Function>
123 <ogc:Literal>{{ printf "%.1f" .High }}</ogc:Literal>
124 </ogc:PropertyIsEqualTo>
125 {{- end -}}
126 {{end }}
127 </ogc:Or>
128 </ogc:Filter>
129 <se:MaxScaleDenominator>5e3</se:MaxScaleDenominator>
130 <se:LineSymbolizer>
131 <se:Stroke>
132 <se:SvgParameter name="stroke-width">1.5</se:SvgParameter>
133 <se:SvgParameter name="stroke">
134 <ogc:Function name="Recode">
135 <ogc:Function name="numberFormat">
136 <ogc:Literal>0.0</ogc:Literal>
137 <ogc:PropertyName>height</ogc:PropertyName>
138 </ogc:Function>
139 {{- range .}}
140 {{if .HasHigh -}}
141 <ogc:Literal>{{ printf "%.1f" .High }}</ogc:Literal>
142 <ogc:Literal>{{.Color}}</ogc:Literal>
143 {{- end -}}
144 {{end}}
145 </ogc:Function>
146 </se:SvgParameter>
147 </se:Stroke>
148 </se:LineSymbolizer>
149 </se:Rule>
150 </se:FeatureTypeStyle>
151 <se:FeatureTypeStyle>
152 <se:Name>contour_lines_label</se:Name>
153 <se:Description>
154 <se:Abstract>
155 FeatureTypeStyle for labels at contour lines
156 </se:Abstract>
157 </se:Description>
158 <se:Rule>
159 <se:MaxScaleDenominator>5e3</se:MaxScaleDenominator>
160 <se:TextSymbolizer>
161 <se:Label>
162 <ogc:Function name="Recode">
163 <ogc:Function name="numberFormat">
164 <ogc:Literal>0.0</ogc:Literal>
165 <ogc:PropertyName>height</ogc:PropertyName>
166 </ogc:Function>
167 {{- range . }}
168 {{ if .HasHigh -}}
169 <ogc:Literal>{{ printf "%.1f" .High}}</ogc:Literal><ogc:Literal>{{ printf "%.1f" .High}}</ogc:Literal>
170 {{- else if .HasLow -}}
171 <ogc:Literal>{{ printf "%.1f" .Low}}</ogc:Literal><ogc:Literal>{{ printf "%.1f" .Low}}</ogc:Literal>
172 {{- end }}
173 {{- end }}
174 </ogc:Function>
175 </se:Label>
176 <se:LabelPlacement>
177 <se:LinePlacement>
178 <se:PerpendicularOffset>5</se:PerpendicularOffset>
179 </se:LinePlacement>
180 </se:LabelPlacement>
181 <se:Font>
182 <se:SvgParameter name="font-family">Avenir</se:SvgParameter>
183 <se:SvgParameter name="font-family">Helvetica</se:SvgParameter>
184 <se:SvgParameter name="font-family">Arial</se:SvgParameter>
185 <se:SvgParameter name="font-family">sans-serif</se:SvgParameter>
186 </se:Font>
187 <se:Fill>
188 <se:SvgParameter name="fill">#070707</se:SvgParameter>
189 </se:Fill>
190 </se:TextSymbolizer>
191 </se:Rule>
192 </se:FeatureTypeStyle>
193 </UserStyle>
194 </NamedLayer>
195 </StyledLayerDescriptor>
196 `
197
198 const origSLD = `
199 <?xml version="1.0" encoding="UTF-8"?>
200 <StyledLayerDescriptor
201 xmlns="http://www.opengis.net/sld"
202 xmlns:se="http://www.opengis.net/se"
203 xmlns:ogc="http://www.opengis.net/ogc"
204 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
205 xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd"
206 version="1.1.0">
207 <NamedLayer>
208 <se:Name>sounding_results_contour_lines</se:Name>
209 <UserStyle>
210 <se:Name>sounding_results_contour_lines</se:Name>
211 <se:FeatureTypeStyle>
212 <se:Name>contour_line_colours</se:Name>
213 <se:Description>
214 <se:Abstract>
215 FeatureTypeStyle defining colour classes for height attribute
216 </se:Abstract>
217 </se:Description>
218 <se:Rule>
219 <se:Name>&#8804; 1.0</se:Name>
220 <ogc:Filter>
221 <ogc:PropertyIsLessThanOrEqualTo>
222 <ogc:PropertyName>height</ogc:PropertyName>
223 <ogc:Literal>1</ogc:Literal>
224 </ogc:PropertyIsLessThanOrEqualTo>
225 </ogc:Filter>
226 <se:LineSymbolizer>
227 <se:Stroke>
228 <se:SvgParameter name="stroke">#ff00dd</se:SvgParameter>
229 <se:SvgParameter name="stroke-width">0.5</se:SvgParameter>
230 </se:Stroke>
231 </se:LineSymbolizer>
232 </se:Rule>
233 <se:Rule>
234 <se:Name>&#8804; 1.5</se:Name>
235 <ogc:Filter>
236 <ogc:And>
237 <ogc:PropertyIsGreaterThan>
238 <ogc:PropertyName>height</ogc:PropertyName>
239 <ogc:Literal>1</ogc:Literal>
240 </ogc:PropertyIsGreaterThan>
241 <ogc:PropertyIsLessThanOrEqualTo>
242 <ogc:PropertyName>height</ogc:PropertyName>
243 <ogc:Literal>1.5</ogc:Literal>
244 </ogc:PropertyIsLessThanOrEqualTo>
245 </ogc:And>
246 </ogc:Filter>
247 <se:LineSymbolizer>
248 <se:Stroke>
249 <se:SvgParameter name="stroke">#fb08b6</se:SvgParameter>
250 <se:SvgParameter name="stroke-width">0.5</se:SvgParameter>
251 </se:Stroke>
252 </se:LineSymbolizer>
253 </se:Rule>
254 <se:Rule>
255 <se:Name>&#8804; 1.7</se:Name>
256 <ogc:Filter>
257 <ogc:And>
258 <ogc:PropertyIsGreaterThan>
259 <ogc:PropertyName>height</ogc:PropertyName>
260 <ogc:Literal>1.5</ogc:Literal>
261 </ogc:PropertyIsGreaterThan>
262 <ogc:PropertyIsLessThanOrEqualTo>
263 <ogc:PropertyName>height</ogc:PropertyName>
264 <ogc:Literal>1.7</ogc:Literal>
265 </ogc:PropertyIsLessThanOrEqualTo>
266 </ogc:And>
267 </ogc:Filter>
268 <se:LineSymbolizer>
269 <se:Stroke>
270 <se:SvgParameter name="stroke">#f81090</se:SvgParameter>
271 <se:SvgParameter name="stroke-width">0.5</se:SvgParameter>
272 </se:Stroke>
273 </se:LineSymbolizer>
274 </se:Rule>
275 <se:Rule>
276 <se:Name>&#8804; 1.9</se:Name>
277 <ogc:Filter>
278 <ogc:And>
279 <ogc:PropertyIsGreaterThan>
280 <ogc:PropertyName>height</ogc:PropertyName>
281 <ogc:Literal>1.7</ogc:Literal>
282 </ogc:PropertyIsGreaterThan>
283 <ogc:PropertyIsLessThanOrEqualTo>
284 <ogc:PropertyName>height</ogc:PropertyName>
285 <ogc:Literal>1.9</ogc:Literal>
286 </ogc:PropertyIsLessThanOrEqualTo>
287 </ogc:And>
288 </ogc:Filter>
289 <se:LineSymbolizer>
290 <se:Stroke>
291 <se:SvgParameter name="stroke">#f5196a</se:SvgParameter>
292 <se:SvgParameter name="stroke-width">0.5</se:SvgParameter>
293 </se:Stroke>
294 </se:LineSymbolizer>
295 </se:Rule>
296 <se:Rule>
297 <se:Name>&#8804; 2.1</se:Name>
298 <ogc:Filter>
299 <ogc:And>
300 <ogc:PropertyIsGreaterThan>
301 <ogc:PropertyName>height</ogc:PropertyName>
302 <ogc:Literal>1.9</ogc:Literal>
303 </ogc:PropertyIsGreaterThan>
304 <ogc:PropertyIsLessThanOrEqualTo>
305 <ogc:PropertyName>height</ogc:PropertyName>
306 <ogc:Literal>2.1</ogc:Literal>
307 </ogc:PropertyIsLessThanOrEqualTo>
308 </ogc:And>
309 </ogc:Filter>
310 <se:LineSymbolizer>
311 <se:Stroke>
312 <se:SvgParameter name="stroke">#f22144</se:SvgParameter>
313 <se:SvgParameter name="stroke-width">0.5</se:SvgParameter>
314 </se:Stroke>
315 </se:LineSymbolizer>
316 </se:Rule>
317 <se:Rule>
318 <se:Name>&#8804; 2.3</se:Name>
319 <ogc:Filter>
320 <ogc:And>
321 <ogc:PropertyIsGreaterThan>
322 <ogc:PropertyName>height</ogc:PropertyName>
323 <ogc:Literal>2.1</ogc:Literal>
324 </ogc:PropertyIsGreaterThan>
325 <ogc:PropertyIsLessThanOrEqualTo>
326 <ogc:PropertyName>height</ogc:PropertyName>
327 <ogc:Literal>2.3</ogc:Literal>
328 </ogc:PropertyIsLessThanOrEqualTo>
329 </ogc:And>
330 </ogc:Filter>
331 <se:LineSymbolizer>
332 <se:Stroke>
333 <se:SvgParameter name="stroke">#f03326</se:SvgParameter>
334 <se:SvgParameter name="stroke-width">0.5</se:SvgParameter>
335 </se:Stroke>
336 </se:LineSymbolizer>
337 </se:Rule>
338 <se:Rule>
339 <se:Name>&#8804; 2.5</se:Name>
340 <ogc:Filter>
341 <ogc:And>
342 <ogc:PropertyIsGreaterThan>
343 <ogc:PropertyName>height</ogc:PropertyName>
344 <ogc:Literal>2.3</ogc:Literal>
345 </ogc:PropertyIsGreaterThan>
346 <ogc:PropertyIsLessThanOrEqualTo>
347 <ogc:PropertyName>height</ogc:PropertyName>
348 <ogc:Literal>2.5</ogc:Literal>
349 </ogc:PropertyIsLessThanOrEqualTo>
350 </ogc:And>
351 </ogc:Filter>
352 <se:LineSymbolizer>
353 <se:Stroke>
354 <se:SvgParameter name="stroke">#f25f20</se:SvgParameter>
355 <se:SvgParameter name="stroke-width">0.5</se:SvgParameter>
356 </se:Stroke>
357 </se:LineSymbolizer>
358 </se:Rule>
359 <se:Rule>
360 <se:Name>&#8804; 2.7</se:Name>
361 <ogc:Filter>
362 <ogc:And>
363 <ogc:PropertyIsGreaterThan>
364 <ogc:PropertyName>height</ogc:PropertyName>
365 <ogc:Literal>2.5</ogc:Literal>
366 </ogc:PropertyIsGreaterThan>
367 <ogc:PropertyIsLessThanOrEqualTo>
368 <ogc:PropertyName>height</ogc:PropertyName>
369 <ogc:Literal>2.7</ogc:Literal>
370 </ogc:PropertyIsLessThanOrEqualTo>
371 </ogc:And>
372 </ogc:Filter>
373 <se:LineSymbolizer>
374 <se:Stroke>
375 <se:SvgParameter name="stroke">#f38b1a</se:SvgParameter>
376 <se:SvgParameter name="stroke-width">0.5</se:SvgParameter>
377 </se:Stroke>
378 </se:LineSymbolizer>
379 </se:Rule>
380 <se:Rule>
381 <se:Name>&#8804; 2.9</se:Name>
382 <ogc:Filter>
383 <ogc:And>
384 <ogc:PropertyIsGreaterThan>
385 <ogc:PropertyName>height</ogc:PropertyName>
386 <ogc:Literal>2.7</ogc:Literal>
387 </ogc:PropertyIsGreaterThan>
388 <ogc:PropertyIsLessThanOrEqualTo>
389 <ogc:PropertyName>height</ogc:PropertyName>
390 <ogc:Literal>2.9</ogc:Literal>
391 </ogc:PropertyIsLessThanOrEqualTo>
392 </ogc:And>
393 </ogc:Filter>
394 <se:LineSymbolizer>
395 <se:Stroke>
396 <se:SvgParameter name="stroke">#f5b814</se:SvgParameter>
397 <se:SvgParameter name="stroke-width">0.5</se:SvgParameter>
398 </se:Stroke>
399 </se:LineSymbolizer>
400 </se:Rule>
401 <se:Rule>
402 <se:Name>&#8804; 3.1</se:Name>
403 <ogc:Filter>
404 <ogc:And>
405 <ogc:PropertyIsGreaterThan>
406 <ogc:PropertyName>height</ogc:PropertyName>
407 <ogc:Literal>2.9</ogc:Literal>
408 </ogc:PropertyIsGreaterThan>
409 <ogc:PropertyIsLessThanOrEqualTo>
410 <ogc:PropertyName>height</ogc:PropertyName>
411 <ogc:Literal>3.1</ogc:Literal>
412 </ogc:PropertyIsLessThanOrEqualTo>
413 </ogc:And>
414 </ogc:Filter>
415 <se:LineSymbolizer>
416 <se:Stroke>
417 <se:SvgParameter name="stroke">#f7e40e</se:SvgParameter>
418 <se:SvgParameter name="stroke-width">0.5</se:SvgParameter>
419 </se:Stroke>
420 </se:LineSymbolizer>
421 </se:Rule>
422 <se:Rule>
423 <se:Name>&#8804; 3.3</se:Name>
424 <ogc:Filter>
425 <ogc:And>
426 <ogc:PropertyIsGreaterThan>
427 <ogc:PropertyName>height</ogc:PropertyName>
428 <ogc:Literal>3.1</ogc:Literal>
429 </ogc:PropertyIsGreaterThan>
430 <ogc:PropertyIsLessThanOrEqualTo>
431 <ogc:PropertyName>height</ogc:PropertyName>
432 <ogc:Literal>3.3</ogc:Literal>
433 </ogc:PropertyIsLessThanOrEqualTo>
434 </ogc:And>
435 </ogc:Filter>
436 <se:LineSymbolizer>
437 <se:Stroke>
438 <se:SvgParameter name="stroke">#e2f30e</se:SvgParameter>
439 <se:SvgParameter name="stroke-width">0.5</se:SvgParameter>
440 </se:Stroke>
441 </se:LineSymbolizer>
442 </se:Rule>
443 <se:Rule>
444 <se:Name>&#8804; 3.5</se:Name>
445 <ogc:Filter>
446 <ogc:And>
447 <ogc:PropertyIsGreaterThan>
448 <ogc:PropertyName>height</ogc:PropertyName>
449 <ogc:Literal>3.3</ogc:Literal>
450 </ogc:PropertyIsGreaterThan>
451 <ogc:PropertyIsLessThanOrEqualTo>
452 <ogc:PropertyName>height</ogc:PropertyName>
453 <ogc:Literal>3.5</ogc:Literal>
454 </ogc:PropertyIsLessThanOrEqualTo>
455 </ogc:And>
456 </ogc:Filter>
457 <se:LineSymbolizer>
458 <se:Stroke>
459 <se:SvgParameter name="stroke">#b6e414</se:SvgParameter>
460 <se:SvgParameter name="stroke-width">0.5</se:SvgParameter>
461 </se:Stroke>
462 </se:LineSymbolizer>
463 </se:Rule>
464 <se:Rule>
465 <se:Name>&#8804; 4.0</se:Name>
466 <ogc:Filter>
467 <ogc:And>
468 <ogc:PropertyIsGreaterThan>
469 <ogc:PropertyName>height</ogc:PropertyName>
470 <ogc:Literal>3.5</ogc:Literal>
471 </ogc:PropertyIsGreaterThan>
472 <ogc:PropertyIsLessThanOrEqualTo>
473 <ogc:PropertyName>height</ogc:PropertyName>
474 <ogc:Literal>4</ogc:Literal>
475 </ogc:PropertyIsLessThanOrEqualTo>
476 </ogc:And>
477 </ogc:Filter>
478 <se:LineSymbolizer>
479 <se:Stroke>
480 <se:SvgParameter name="stroke">#8ad51a</se:SvgParameter>
481 <se:SvgParameter name="stroke-width">0.5</se:SvgParameter>
482 </se:Stroke>
483 </se:LineSymbolizer>
484 </se:Rule>
485 <se:Rule>
486 <se:Name>&#8804; 4.5</se:Name>
487 <ogc:Filter>
488 <ogc:And>
489 <ogc:PropertyIsGreaterThan>
490 <ogc:PropertyName>height</ogc:PropertyName>
491 <ogc:Literal>4</ogc:Literal>
492 </ogc:PropertyIsGreaterThan>
493 <ogc:PropertyIsLessThanOrEqualTo>
494 <ogc:PropertyName>height</ogc:PropertyName>
495 <ogc:Literal>4.5</ogc:Literal>
496 </ogc:PropertyIsLessThanOrEqualTo>
497 </ogc:And>
498 </ogc:Filter>
499 <se:LineSymbolizer>
500 <se:Stroke>
501 <se:SvgParameter name="stroke">#5ec620</se:SvgParameter>
502 <se:SvgParameter name="stroke-width">0.5</se:SvgParameter>
503 </se:Stroke>
504 </se:LineSymbolizer>
505 </se:Rule>
506 <se:Rule>
507 <se:Name>&#8804; 5.0</se:Name>
508 <ogc:Filter>
509 <ogc:And>
510 <ogc:PropertyIsGreaterThan>
511 <ogc:PropertyName>height</ogc:PropertyName>
512 <ogc:Literal>4.5</ogc:Literal>
513 </ogc:PropertyIsGreaterThan>
514 <ogc:PropertyIsLessThanOrEqualTo>
515 <ogc:PropertyName>height</ogc:PropertyName>
516 <ogc:Literal>5</ogc:Literal>
517 </ogc:PropertyIsLessThanOrEqualTo>
518 </ogc:And>
519 </ogc:Filter>
520 <se:LineSymbolizer>
521 <se:Stroke>
522 <se:SvgParameter name="stroke">#32b726</se:SvgParameter>
523 <se:SvgParameter name="stroke-width">0.5</se:SvgParameter>
524 </se:Stroke>
525 </se:LineSymbolizer>
526 </se:Rule>
527 <se:Rule>
528 <se:Name>&#8804; 5.5</se:Name>
529 <ogc:Filter>
530 <ogc:And>
531 <ogc:PropertyIsGreaterThan>
532 <ogc:PropertyName>height</ogc:PropertyName>
533 <ogc:Literal>5</ogc:Literal>
534 </ogc:PropertyIsGreaterThan>
535 <ogc:PropertyIsLessThanOrEqualTo>
536 <ogc:PropertyName>height</ogc:PropertyName>
537 <ogc:Literal>5.5</ogc:Literal>
538 </ogc:PropertyIsLessThanOrEqualTo>
539 </ogc:And>
540 </ogc:Filter>
541 <se:LineSymbolizer>
542 <se:Stroke>
543 <se:SvgParameter name="stroke">#249a49</se:SvgParameter>
544 <se:SvgParameter name="stroke-width">0.5</se:SvgParameter>
545 </se:Stroke>
546 </se:LineSymbolizer>
547 </se:Rule>
548 <se:Rule>
549 <se:Name>&#8804; 6.0</se:Name>
550 <ogc:Filter>
551 <ogc:And>
552 <ogc:PropertyIsGreaterThan>
553 <ogc:PropertyName>height</ogc:PropertyName>
554 <ogc:Literal>5.5</ogc:Literal>
555 </ogc:PropertyIsGreaterThan>
556 <ogc:PropertyIsLessThanOrEqualTo>
557 <ogc:PropertyName>height</ogc:PropertyName>
558 <ogc:Literal>6</ogc:Literal>
559 </ogc:PropertyIsLessThanOrEqualTo>
560 </ogc:And>
561 </ogc:Filter>
562 <se:LineSymbolizer>
563 <se:Stroke>
564 <se:SvgParameter name="stroke">#207977</se:SvgParameter>
565 <se:SvgParameter name="stroke-width">0.5</se:SvgParameter>
566 </se:Stroke>
567 </se:LineSymbolizer>
568 </se:Rule>
569 <se:Rule>
570 <se:Name>&#8804; 6.5</se:Name>
571 <ogc:Filter>
572 <ogc:And>
573 <ogc:PropertyIsGreaterThan>
574 <ogc:PropertyName>height</ogc:PropertyName>
575 <ogc:Literal>6</ogc:Literal>
576 </ogc:PropertyIsGreaterThan>
577 <ogc:PropertyIsLessThanOrEqualTo>
578 <ogc:PropertyName>height</ogc:PropertyName>
579 <ogc:Literal>6.5</ogc:Literal>
580 </ogc:PropertyIsLessThanOrEqualTo>
581 </ogc:And>
582 </ogc:Filter>
583 <se:LineSymbolizer>
584 <se:Stroke>
585 <se:SvgParameter name="stroke">#1c57a4</se:SvgParameter>
586 <se:SvgParameter name="stroke-width">0.5</se:SvgParameter>
587 </se:Stroke>
588 </se:LineSymbolizer>
589 </se:Rule>
590 <se:Rule>
591 <se:Name>&#8804; 7.0</se:Name>
592 <ogc:Filter>
593 <ogc:And>
594 <ogc:PropertyIsGreaterThan>
595 <ogc:PropertyName>height</ogc:PropertyName>
596 <ogc:Literal>6.5</ogc:Literal>
597 </ogc:PropertyIsGreaterThan>
598 <ogc:PropertyIsLessThanOrEqualTo>
599 <ogc:PropertyName>height</ogc:PropertyName>
600 <ogc:Literal>7</ogc:Literal>
601 </ogc:PropertyIsLessThanOrEqualTo>
602 </ogc:And>
603 </ogc:Filter>
604 <se:LineSymbolizer>
605 <se:Stroke>
606 <se:SvgParameter name="stroke">#1835d1</se:SvgParameter>
607 <se:SvgParameter name="stroke-width">0.5</se:SvgParameter>
608 </se:Stroke>
609 </se:LineSymbolizer>
610 </se:Rule>
611 <se:Rule>
612 <se:Name>&gt; 7.0</se:Name>
613 <ogc:Filter>
614 <ogc:PropertyIsGreaterThan>
615 <ogc:PropertyName>height</ogc:PropertyName>
616 <ogc:Literal>7</ogc:Literal>
617 </ogc:PropertyIsGreaterThan>
618 </ogc:Filter>
619 <se:LineSymbolizer>
620 <se:Stroke>
621 <se:SvgParameter name="stroke">#1414ff</se:SvgParameter>
622 <se:SvgParameter name="stroke-width">0.5</se:SvgParameter>
623 </se:Stroke>
624 </se:LineSymbolizer>
625 </se:Rule>
626 </se:FeatureTypeStyle>
627 <se:FeatureTypeStyle>
628 <se:Name>contour_lines_emph</se:Name>
629 <se:Description>
630 <se:Abstract>
631 FeatureTypeStyle for emphasized contour lines
632 </se:Abstract>
633 </se:Description>
634 <se:Rule>
635 <se:LegendGraphic>
636 <se:Graphic>
637 </se:Graphic>
638 </se:LegendGraphic>
639 <ogc:Filter>
640 <ogc:Or>
641 <ogc:PropertyIsEqualTo>
642 <ogc:Function name="numberFormat">
643 <ogc:Literal>0.0</ogc:Literal>
644 <ogc:PropertyName>height</ogc:PropertyName>
645 </ogc:Function>
646 <ogc:Literal>1.0</ogc:Literal>
647 </ogc:PropertyIsEqualTo>
648 <ogc:PropertyIsEqualTo>
649 <ogc:Function name="numberFormat">
650 <ogc:Literal>0.0</ogc:Literal>
651 <ogc:PropertyName>height</ogc:PropertyName>
652 </ogc:Function>
653 <ogc:Literal>1.5</ogc:Literal>
654 </ogc:PropertyIsEqualTo>
655 <ogc:PropertyIsEqualTo>
656 <ogc:Function name="numberFormat">
657 <ogc:Literal>0.0</ogc:Literal>
658 <ogc:PropertyName>height</ogc:PropertyName>
659 </ogc:Function>
660 <ogc:Literal>1.7</ogc:Literal>
661 </ogc:PropertyIsEqualTo>
662 <ogc:PropertyIsEqualTo>
663 <ogc:Function name="numberFormat">
664 <ogc:Literal>0.0</ogc:Literal>
665 <ogc:PropertyName>height</ogc:PropertyName>
666 </ogc:Function>
667 <ogc:Literal>1.9</ogc:Literal>
668 </ogc:PropertyIsEqualTo>
669 <ogc:PropertyIsEqualTo>
670 <ogc:Function name="numberFormat">
671 <ogc:Literal>0.0</ogc:Literal>
672 <ogc:PropertyName>height</ogc:PropertyName>
673 </ogc:Function>
674 <ogc:Literal>2.1</ogc:Literal>
675 </ogc:PropertyIsEqualTo>
676 <ogc:PropertyIsEqualTo>
677 <ogc:Function name="numberFormat">
678 <ogc:Literal>0.0</ogc:Literal>
679 <ogc:PropertyName>height</ogc:PropertyName>
680 </ogc:Function>
681 <ogc:Literal>2.3</ogc:Literal>
682 </ogc:PropertyIsEqualTo>
683 <ogc:PropertyIsEqualTo>
684 <ogc:Function name="numberFormat">
685 <ogc:Literal>0.0</ogc:Literal>
686 <ogc:PropertyName>height</ogc:PropertyName>
687 </ogc:Function>
688 <ogc:Literal>2.5</ogc:Literal>
689 </ogc:PropertyIsEqualTo>
690 <ogc:PropertyIsEqualTo>
691 <ogc:Function name="numberFormat">
692 <ogc:Literal>0.0</ogc:Literal>
693 <ogc:PropertyName>height</ogc:PropertyName>
694 </ogc:Function>
695 <ogc:Literal>2.7</ogc:Literal>
696 </ogc:PropertyIsEqualTo>
697 <ogc:PropertyIsEqualTo>
698 <ogc:Function name="numberFormat">
699 <ogc:Literal>0.0</ogc:Literal>
700 <ogc:PropertyName>height</ogc:PropertyName>
701 </ogc:Function>
702 <ogc:Literal>2.9</ogc:Literal>
703 </ogc:PropertyIsEqualTo>
704 <ogc:PropertyIsEqualTo>
705 <ogc:Function name="numberFormat">
706 <ogc:Literal>0.0</ogc:Literal>
707 <ogc:PropertyName>height</ogc:PropertyName>
708 </ogc:Function>
709 <ogc:Literal>3.1</ogc:Literal>
710 </ogc:PropertyIsEqualTo>
711 <ogc:PropertyIsEqualTo>
712 <ogc:Function name="numberFormat">
713 <ogc:Literal>0.0</ogc:Literal>
714 <ogc:PropertyName>height</ogc:PropertyName>
715 </ogc:Function>
716 <ogc:Literal>3.3</ogc:Literal>
717 </ogc:PropertyIsEqualTo>
718 <ogc:PropertyIsEqualTo>
719 <ogc:Function name="numberFormat">
720 <ogc:Literal>0.0</ogc:Literal>
721 <ogc:PropertyName>height</ogc:PropertyName>
722 </ogc:Function>
723 <ogc:Literal>3.5</ogc:Literal>
724 </ogc:PropertyIsEqualTo>
725 <ogc:PropertyIsEqualTo>
726 <ogc:Function name="numberFormat">
727 <ogc:Literal>0.0</ogc:Literal>
728 <ogc:PropertyName>height</ogc:PropertyName>
729 </ogc:Function>
730 <ogc:Literal>4.0</ogc:Literal>
731 </ogc:PropertyIsEqualTo>
732 <ogc:PropertyIsEqualTo>
733 <ogc:Function name="numberFormat">
734 <ogc:Literal>0.0</ogc:Literal>
735 <ogc:PropertyName>height</ogc:PropertyName>
736 </ogc:Function>
737 <ogc:Literal>4.5</ogc:Literal>
738 </ogc:PropertyIsEqualTo>
739 <ogc:PropertyIsEqualTo>
740 <ogc:Function name="numberFormat">
741 <ogc:Literal>0.0</ogc:Literal>
742 <ogc:PropertyName>height</ogc:PropertyName>
743 </ogc:Function>
744 <ogc:Literal>5.0</ogc:Literal>
745 </ogc:PropertyIsEqualTo>
746 <ogc:PropertyIsEqualTo>
747 <ogc:Function name="numberFormat">
748 <ogc:Literal>0.0</ogc:Literal>
749 <ogc:PropertyName>height</ogc:PropertyName>
750 </ogc:Function>
751 <ogc:Literal>5.5</ogc:Literal>
752 </ogc:PropertyIsEqualTo>
753 <ogc:PropertyIsEqualTo>
754 <ogc:Function name="numberFormat">
755 <ogc:Literal>0.0</ogc:Literal>
756 <ogc:PropertyName>height</ogc:PropertyName>
757 </ogc:Function>
758 <ogc:Literal>6.0</ogc:Literal>
759 </ogc:PropertyIsEqualTo>
760 <ogc:PropertyIsEqualTo>
761 <ogc:Function name="numberFormat">
762 <ogc:Literal>0.0</ogc:Literal>
763 <ogc:PropertyName>height</ogc:PropertyName>
764 </ogc:Function>
765 <ogc:Literal>6.5</ogc:Literal>
766 </ogc:PropertyIsEqualTo>
767 <ogc:PropertyIsEqualTo>
768 <ogc:Function name="numberFormat">
769 <ogc:Literal>0.0</ogc:Literal>
770 <ogc:PropertyName>height</ogc:PropertyName>
771 </ogc:Function>
772 <ogc:Literal>7.0</ogc:Literal>
773 </ogc:PropertyIsEqualTo>
774 <ogc:PropertyIsEqualTo>
775 <ogc:Function name="numberFormat">
776 <ogc:Literal>0.0</ogc:Literal>
777 <ogc:PropertyName>height</ogc:PropertyName>
778 </ogc:Function>
779 <ogc:Literal>7.5</ogc:Literal>
780 </ogc:PropertyIsEqualTo>
781 </ogc:Or>
782 </ogc:Filter>
783 <se:MaxScaleDenominator>5e3</se:MaxScaleDenominator>
784 <se:LineSymbolizer>
785 <se:Stroke>
786 <se:SvgParameter name="stroke-width">1.5</se:SvgParameter>
787 <se:SvgParameter name="stroke">
788 <ogc:Function name="Recode">
789 <ogc:Function name="numberFormat">
790 <ogc:Literal>0.0</ogc:Literal>
791 <ogc:PropertyName>height</ogc:PropertyName>
792 </ogc:Function>
793 <ogc:Literal>1.0</ogc:Literal>
794 <ogc:Literal>#ff00dd</ogc:Literal>
795 <ogc:Literal>1.5</ogc:Literal>
796 <ogc:Literal>#fb08b6</ogc:Literal>
797 <ogc:Literal>1.7</ogc:Literal>
798 <ogc:Literal>#f81090</ogc:Literal>
799 <ogc:Literal>1.9</ogc:Literal>
800 <ogc:Literal>#f5196a</ogc:Literal>
801 <ogc:Literal>2.1</ogc:Literal>
802 <ogc:Literal>#f22144</ogc:Literal>
803 <ogc:Literal>2.3</ogc:Literal>
804 <ogc:Literal>#f03326</ogc:Literal>
805 <ogc:Literal>2.5</ogc:Literal>
806 <ogc:Literal>#f25f20</ogc:Literal>
807 <ogc:Literal>2.7</ogc:Literal>
808 <ogc:Literal>#f38b1a</ogc:Literal>
809 <ogc:Literal>2.9</ogc:Literal>
810 <ogc:Literal>#f5b814</ogc:Literal>
811 <ogc:Literal>3.1</ogc:Literal>
812 <ogc:Literal>#f7e40e</ogc:Literal>
813 <ogc:Literal>3.3</ogc:Literal>
814 <ogc:Literal>#e2f30e</ogc:Literal>
815 <ogc:Literal>3.5</ogc:Literal>
816 <ogc:Literal>#b6e414</ogc:Literal>
817 <ogc:Literal>4.0</ogc:Literal>
818 <ogc:Literal>#8ad51a</ogc:Literal>
819 <ogc:Literal>4.5</ogc:Literal>
820 <ogc:Literal>#5ec620</ogc:Literal>
821 <ogc:Literal>5.0</ogc:Literal>
822 <ogc:Literal>#32b726</ogc:Literal>
823 <ogc:Literal>5.5</ogc:Literal>
824 <ogc:Literal>#249a49</ogc:Literal>
825 <ogc:Literal>6.0</ogc:Literal>
826 <ogc:Literal>#207977</ogc:Literal>
827 <ogc:Literal>6.5</ogc:Literal>
828 <ogc:Literal>#1c57a4</ogc:Literal>
829 <ogc:Literal>7.0</ogc:Literal>
830 <ogc:Literal>#1835d1</ogc:Literal>
831 <ogc:Literal>7.5</ogc:Literal>
832 <ogc:Literal>#1414ff</ogc:Literal>
833 </ogc:Function>
834 </se:SvgParameter>
835 </se:Stroke>
836 </se:LineSymbolizer>
837 </se:Rule>
838 </se:FeatureTypeStyle>
839 <se:FeatureTypeStyle>
840 <se:Name>contour_lines_label</se:Name>
841 <se:Description>
842 <se:Abstract>
843 FeatureTypeStyle for labels at contour lines
844 </se:Abstract>
845 </se:Description>
846 <se:Rule>
847 <se:MaxScaleDenominator>5e3</se:MaxScaleDenominator>
848 <se:TextSymbolizer>
849 <se:Label>
850 <ogc:Function name="Recode">
851 <ogc:Function name="numberFormat">
852 <ogc:Literal>0.0</ogc:Literal>
853 <ogc:PropertyName>height</ogc:PropertyName>
854 </ogc:Function>
855 <ogc:Literal>1.0</ogc:Literal><ogc:Literal>1.0</ogc:Literal>
856 <ogc:Literal>1.5</ogc:Literal><ogc:Literal>1.5</ogc:Literal>
857 <ogc:Literal>1.7</ogc:Literal><ogc:Literal>1.7</ogc:Literal>
858 <ogc:Literal>1.9</ogc:Literal><ogc:Literal>1.9</ogc:Literal>
859 <ogc:Literal>2.1</ogc:Literal><ogc:Literal>2.1</ogc:Literal>
860 <ogc:Literal>2.3</ogc:Literal><ogc:Literal>2.3</ogc:Literal>
861 <ogc:Literal>2.5</ogc:Literal><ogc:Literal>2.5</ogc:Literal>
862 <ogc:Literal>2.7</ogc:Literal><ogc:Literal>2.7</ogc:Literal>
863 <ogc:Literal>2.9</ogc:Literal><ogc:Literal>2.9</ogc:Literal>
864 <ogc:Literal>3.1</ogc:Literal><ogc:Literal>3.1</ogc:Literal>
865 <ogc:Literal>3.3</ogc:Literal><ogc:Literal>3.3</ogc:Literal>
866 <ogc:Literal>3.5</ogc:Literal><ogc:Literal>3.5</ogc:Literal>
867 <ogc:Literal>4.0</ogc:Literal><ogc:Literal>4.0</ogc:Literal>
868 <ogc:Literal>4.5</ogc:Literal><ogc:Literal>4.5</ogc:Literal>
869 <ogc:Literal>5.0</ogc:Literal><ogc:Literal>5.0</ogc:Literal>
870 <ogc:Literal>5.5</ogc:Literal><ogc:Literal>5.5</ogc:Literal>
871 <ogc:Literal>6.0</ogc:Literal><ogc:Literal>6.0</ogc:Literal>
872 <ogc:Literal>6.5</ogc:Literal><ogc:Literal>6.5</ogc:Literal>
873 <ogc:Literal>7.0</ogc:Literal><ogc:Literal>7.0</ogc:Literal>
874 <ogc:Literal>7.5</ogc:Literal><ogc:Literal>7.5</ogc:Literal>
875 </ogc:Function>
876 </se:Label>
877 <se:LabelPlacement>
878 <se:LinePlacement>
879 <se:PerpendicularOffset>5</se:PerpendicularOffset>
880 </se:LinePlacement>
881 </se:LabelPlacement>
882 <se:Font>
883 <se:SvgParameter name="font-family">Avenir</se:SvgParameter>
884 <se:SvgParameter name="font-family">Helvetica</se:SvgParameter>
885 <se:SvgParameter name="font-family">Arial</se:SvgParameter>
886 <se:SvgParameter name="font-family">sans-serif</se:SvgParameter>
887 </se:Font>
888 <se:Fill>
889 <se:SvgParameter name="fill">#070707</se:SvgParameter>
890 </se:Fill>
891 </se:TextSymbolizer>
892 </se:Rule>
893 </se:FeatureTypeStyle>
894 </UserStyle>
895 </NamedLayer>
896 </StyledLayerDescriptor>
897 `
898
899 const classBreaksConfig = `1:#ff00dd,1.5,1.7,1.9,2.1,2.3,2.5:#f25f20,2.7,2.9,3.1,3.3,3.5,4:#8ad51a,4.5,5,5.5,6,6.5,7,7.5:#1414ff`
900
901 type classBreaks struct {
902 High float64
903 HasHigh bool
904 Low float64
905 HasLow bool
906 Color string
907 }
908
909 func TestTemplate(t *testing.T) {
910
911 ccs, err := parseColorClasses(classBreaksConfig)
912 if err != nil {
913 t.Fatalf("parsing color config failed: %v", err)
914 }
915
916 /*
917 for i := range ccs {
918 fmt.Printf("%.1f #%02x%02x%02x\n",
919 ccs[i].value,
920 ccs[i].color.R,
921 ccs[i].color.G,
922 ccs[i].color.B)
923 }
924 */
925
926 cbs := make([]classBreaks, len(ccs))
927 for i := range ccs {
928 if i > 0 {
929 cbs[i].Low = ccs[i-1].value
930 cbs[i].HasLow = true
931 }
932 if i < len(ccs)-1 {
933 cbs[i].High = ccs[i].value
934 cbs[i].HasHigh = true
935 }
936 cbs[i].Color = fmt.Sprintf("#%02x%02x%02x",
937 ccs[i].color.R,
938 ccs[i].color.G,
939 ccs[i].color.B)
940 }
941
942 tmpl, err := template.New("test").Parse(sldTmplTxt)
943 if err != nil {
944 t.Fatalf("parsing template failed: %v", err)
945 }
946
947 var buf strings.Builder
948 if err := tmpl.Execute(&buf, cbs); err != nil {
949 t.Fatalf("templating failed: %v", err)
950 }
951
952 has := buf.String()
953 if has != origSLD {
954 dmp := diffmatchpatch.New()
955 diffs := dmp.DiffMain(has, origSLD, true)
956 t.Fatalf("Templating results differ: %s", dmp.DiffPrettyText(diffs))
957 }
958 }