Skip to content

Commit abaa114

Browse files
authored
Fix SLD generation when using string operators such as le (MapServer#7522)
* Add tests for string operators * Update encoding * For operators such as 'le' check for spaces
1 parent ffa1014 commit abaa114

8 files changed

Lines changed: 233 additions & 3 deletions
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<StyledLayerDescriptor version="1.1.0" xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd" xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xmlns:se="http://www.opengis.net/se" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
2+
<NamedLayer>
3+
<se:Name>Test32</se:Name>
4+
<UserStyle>
5+
<se:FeatureTypeStyle>
6+
<se:Rule>
7+
<ogc:Filter><ogc:And><ogc:PropertyIsGreaterThan><ogc:PropertyName>field_le</ogc:PropertyName><ogc:Literal>0</ogc:Literal></ogc:PropertyIsGreaterThan><ogc:PropertyIsLessThanOrEqualTo><ogc:PropertyName>field_le</ogc:PropertyName><ogc:Literal>6</ogc:Literal></ogc:PropertyIsLessThanOrEqualTo></ogc:And></ogc:Filter>
8+
<se:PointSymbolizer>
9+
<se:Graphic>
10+
<se:Mark>
11+
<se:WellKnownName>square</se:WellKnownName>
12+
<se:Fill>
13+
<se:SvgParameter name="fill">#00b050</se:SvgParameter>
14+
</se:Fill>
15+
</se:Mark>
16+
<se:Size>1</se:Size>
17+
</se:Graphic>
18+
</se:PointSymbolizer>
19+
</se:Rule>
20+
</se:FeatureTypeStyle>
21+
</UserStyle>
22+
</NamedLayer>
23+
</StyledLayerDescriptor>
24+
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<StyledLayerDescriptor version="1.1.0" xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd" xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xmlns:se="http://www.opengis.net/se" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
2+
<NamedLayer>
3+
<se:Name>Test33</se:Name>
4+
<UserStyle>
5+
<se:FeatureTypeStyle>
6+
<se:Rule>
7+
<ogc:Filter><ogc:And><ogc:PropertyIsGreaterThan><ogc:PropertyName>field_ge</ogc:PropertyName><ogc:Literal>0</ogc:Literal></ogc:PropertyIsGreaterThan><ogc:PropertyIsGreaterThanOrEqualTo><ogc:PropertyName>field_ge</ogc:PropertyName><ogc:Literal>6</ogc:Literal></ogc:PropertyIsGreaterThanOrEqualTo></ogc:And></ogc:Filter>
8+
<se:PointSymbolizer>
9+
<se:Graphic>
10+
<se:Mark>
11+
<se:WellKnownName>square</se:WellKnownName>
12+
<se:Fill>
13+
<se:SvgParameter name="fill">#00b050</se:SvgParameter>
14+
</se:Fill>
15+
</se:Mark>
16+
<se:Size>1</se:Size>
17+
</se:Graphic>
18+
</se:PointSymbolizer>
19+
</se:Rule>
20+
</se:FeatureTypeStyle>
21+
</UserStyle>
22+
</NamedLayer>
23+
</StyledLayerDescriptor>
24+
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<StyledLayerDescriptor version="1.1.0" xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd" xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xmlns:se="http://www.opengis.net/se" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
2+
<NamedLayer>
3+
<se:Name>Test34</se:Name>
4+
<UserStyle>
5+
<se:FeatureTypeStyle>
6+
<se:Rule>
7+
<ogc:Filter><ogc:And><ogc:PropertyIsGreaterThan><ogc:PropertyName>field_lt</ogc:PropertyName><ogc:Literal>0</ogc:Literal></ogc:PropertyIsGreaterThan><ogc:PropertyIsLessThanOrEqualTo><ogc:PropertyName>field_lt</ogc:PropertyName><ogc:Literal>10</ogc:Literal></ogc:PropertyIsLessThanOrEqualTo></ogc:And></ogc:Filter>
8+
<se:PointSymbolizer>
9+
<se:Graphic>
10+
<se:Mark>
11+
<se:WellKnownName>square</se:WellKnownName>
12+
<se:Fill>
13+
<se:SvgParameter name="fill">#00b050</se:SvgParameter>
14+
</se:Fill>
15+
</se:Mark>
16+
<se:Size>1</se:Size>
17+
</se:Graphic>
18+
</se:PointSymbolizer>
19+
</se:Rule>
20+
</se:FeatureTypeStyle>
21+
</UserStyle>
22+
</NamedLayer>
23+
</StyledLayerDescriptor>
24+
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<StyledLayerDescriptor version="1.1.0" xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd" xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xmlns:se="http://www.opengis.net/se" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
2+
<NamedLayer>
3+
<se:Name>Test35</se:Name>
4+
<UserStyle>
5+
<se:FeatureTypeStyle>
6+
<se:Rule>
7+
<ogc:Filter><ogc:And><ogc:PropertyIsGreaterThan><ogc:PropertyName>field_gt</ogc:PropertyName><ogc:Literal>0</ogc:Literal></ogc:PropertyIsGreaterThan><ogc:PropertyIsLessThanOrEqualTo><ogc:PropertyName>field_gt</ogc:PropertyName><ogc:Literal>10</ogc:Literal></ogc:PropertyIsLessThanOrEqualTo></ogc:And></ogc:Filter>
8+
<se:PointSymbolizer>
9+
<se:Graphic>
10+
<se:Mark>
11+
<se:WellKnownName>square</se:WellKnownName>
12+
<se:Fill>
13+
<se:SvgParameter name="fill">#00b050</se:SvgParameter>
14+
</se:Fill>
15+
</se:Mark>
16+
<se:Size>1</se:Size>
17+
</se:Graphic>
18+
</se:PointSymbolizer>
19+
</se:Rule>
20+
</se:FeatureTypeStyle>
21+
</UserStyle>
22+
</NamedLayer>
23+
</StyledLayerDescriptor>
24+
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<StyledLayerDescriptor version="1.1.0" xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd" xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xmlns:se="http://www.opengis.net/se" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
2+
<NamedLayer>
3+
<se:Name>Test36</se:Name>
4+
<UserStyle>
5+
<se:FeatureTypeStyle>
6+
<se:Rule>
7+
<ogc:Filter><ogc:And><ogc:PropertyIsNotEqualTo><ogc:PropertyName>field_ne</ogc:PropertyName><ogc:Literal>0</ogc:Literal></ogc:PropertyIsNotEqualTo><ogc:PropertyIsNotEqualTo><ogc:PropertyName>field_ne</ogc:PropertyName><ogc:Literal>99</ogc:Literal></ogc:PropertyIsNotEqualTo></ogc:And></ogc:Filter>
8+
<se:PointSymbolizer>
9+
<se:Graphic>
10+
<se:Mark>
11+
<se:WellKnownName>square</se:WellKnownName>
12+
<se:Fill>
13+
<se:SvgParameter name="fill">#00b050</se:SvgParameter>
14+
</se:Fill>
15+
</se:Mark>
16+
<se:Size>1</se:Size>
17+
</se:Graphic>
18+
</se:PointSymbolizer>
19+
</se:Rule>
20+
</se:FeatureTypeStyle>
21+
</UserStyle>
22+
</NamedLayer>
23+
</StyledLayerDescriptor>
24+
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<StyledLayerDescriptor version="1.1.0" xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd" xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xmlns:se="http://www.opengis.net/se" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
2+
<NamedLayer>
3+
<se:Name>Test37</se:Name>
4+
<UserStyle>
5+
<se:FeatureTypeStyle>
6+
<se:Rule>
7+
<ogc:Filter><ogc:And><ogc:PropertyIsGreaterThan><ogc:PropertyName>field_le</ogc:PropertyName><ogc:Literal>0</ogc:Literal></ogc:PropertyIsGreaterThan><ogc:PropertyIsLessThanOrEqualTo><ogc:PropertyName>field_le</ogc:PropertyName><ogc:Literal>6</ogc:Literal></ogc:PropertyIsLessThanOrEqualTo></ogc:And></ogc:Filter>
8+
<se:PointSymbolizer>
9+
<se:Graphic>
10+
<se:Mark>
11+
<se:WellKnownName>square</se:WellKnownName>
12+
<se:Fill>
13+
<se:SvgParameter name="fill">#00b050</se:SvgParameter>
14+
</se:Fill>
15+
</se:Mark>
16+
<se:Size>1</se:Size>
17+
</se:Graphic>
18+
</se:PointSymbolizer>
19+
</se:Rule>
20+
</se:FeatureTypeStyle>
21+
</UserStyle>
22+
</NamedLayer>
23+
</StyledLayerDescriptor>
24+

msautotest/wxs/wms_styles_expressions.map

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,13 @@
3737
# RUN_PARMS: wms_getstyles_expressions30.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetStyles&layers=Test30" > [RESULT_DEMIME]
3838
# RUN_PARMS: wms_getstyles_expressions31.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetStyles&layers=Test31" > [RESULT_DEMIME]
3939

40+
# RUN_PARMS: wms_getstyles_expressions32.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetStyles&layers=Test32" > [RESULT_DEMIME]
41+
# RUN_PARMS: wms_getstyles_expressions33.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetStyles&layers=Test33" > [RESULT_DEMIME]
42+
# RUN_PARMS: wms_getstyles_expressions34.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetStyles&layers=Test34" > [RESULT_DEMIME]
43+
# RUN_PARMS: wms_getstyles_expressions35.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetStyles&layers=Test35" > [RESULT_DEMIME]
44+
# RUN_PARMS: wms_getstyles_expressions36.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetStyles&layers=Test36" > [RESULT_DEMIME]
45+
# RUN_PARMS: wms_getstyles_expressions37.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetStyles&layers=Test37" > [RESULT_DEMIME]
46+
4047
MAP
4148
NAME WMS_TEST
4249

@@ -479,4 +486,81 @@ MAP
479486
END
480487
END
481488

489+
# field name containing "le"
490+
LAYER
491+
NAME "Test32"
492+
TYPE POINT
493+
CLASS
494+
EXPRESSION (([field_le] > 0) AND ([field_le] <= 6))
495+
STYLE
496+
COLOR 0 176 80
497+
WIDTH 1
498+
END
499+
END
500+
END
501+
502+
# field name containing "ge"
503+
LAYER
504+
NAME "Test33"
505+
TYPE POINT
506+
CLASS
507+
EXPRESSION (([field_ge] > 0) AND ([field_ge] >= 6))
508+
STYLE
509+
COLOR 0 176 80
510+
WIDTH 1
511+
END
512+
END
513+
END
514+
515+
# field name containing "lt"
516+
LAYER
517+
NAME "Test34"
518+
TYPE POINT
519+
CLASS
520+
EXPRESSION (([field_lt] > 0) AND ([field_lt] <= 10))
521+
STYLE
522+
COLOR 0 176 80
523+
WIDTH 1
524+
END
525+
END
526+
END
527+
528+
# field name containing "gt"
529+
LAYER
530+
NAME "Test35"
531+
TYPE POINT
532+
CLASS
533+
EXPRESSION (([field_gt] > 0) AND ([field_gt] <= 10))
534+
STYLE
535+
COLOR 0 176 80
536+
WIDTH 1
537+
END
538+
END
539+
END
540+
541+
# field name containing "ne"
542+
LAYER
543+
NAME "Test36"
544+
TYPE POINT
545+
CLASS
546+
EXPRESSION (([field_ne] != 0) AND ([field_ne] != 99))
547+
STYLE
548+
COLOR 0 176 80
549+
WIDTH 1
550+
END
551+
END
552+
END
553+
554+
# field name containing "le" with no spaces around operator
555+
LAYER
556+
NAME "Test37"
557+
TYPE POINT
558+
CLASS
559+
EXPRESSION (([field_le]>0) AND ([field_le]<=6))
560+
STYLE
561+
COLOR 0 176 80
562+
WIDTH 1
563+
END
564+
END
565+
END
482566
END

src/mapogcsld.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4981,9 +4981,11 @@ static char *msSLDGetAttributeNameOrValue(const char *pszExpression,
49814981
iValue = 0;
49824982
for (int i = 0; i < nLength; i++) {
49834983
// Check for comparison operator
4984-
if ((i + 1 < nLength && EQUALN(&pszExpression[i], szCompare, 2)) ||
4985-
(i + 1 < nLength && EQUALN(&pszExpression[i], szCompare2, 2)) ||
4986-
(i + 1 < nLength && EQUALN(&pszExpression[i], szCompare3, 2))) {
4984+
if ((i + 1 < nLength && EQUALN(&pszExpression[i], szCompare2, 2)) ||
4985+
(i + 1 < nLength && EQUALN(&pszExpression[i], szCompare3, 2)) ||
4986+
(i + 1 < nLength && EQUALN(&pszExpression[i], szCompare, 2) &&
4987+
(i == 0 || pszExpression[i - 1] == ' ') &&
4988+
(i + 2 >= nLength || pszExpression[i + 2] == ' '))) {
49874989
// Extract value after the operator
49884990
int offset = 2; // All operators are 2 characters long
49894991
pszAttributeValue = msStrdup(&pszExpression[i + offset]);

0 commit comments

Comments
 (0)