Skip to content

Commit 857a138

Browse files
committed
Add RENDERMODE PROCESSING directive to use SLD rendering in Mapfiles
1 parent c3449ac commit 857a138

3 files changed

Lines changed: 73 additions & 1 deletion

File tree

mapdraw.c

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1013,6 +1013,40 @@ int msDrawVectorLayer(mapObj *map, layerObj *layer, imageObj *image)
10131013
if(layer->minfeaturesize > 0)
10141014
minfeaturesize = Pix2LayerGeoref(map, layer, layer->minfeaturesize);
10151015

1016+
// Select how to render classes
1017+
// MS_FIRST_MATCHING_CLASS: Default and historic MapServer behavior
1018+
// MS_ALL_MATCHING_CLASSES: SLD behavior
1019+
int ref_rendermode;
1020+
char * rendermodestr = msLayerGetProcessingKey(layer, "RENDERMODE");
1021+
if (layer->rendermode == MS_ALL_MATCHING_CLASSES)
1022+
{
1023+
// SLD takes precedence
1024+
ref_rendermode = MS_ALL_MATCHING_CLASSES;
1025+
}
1026+
else if (!rendermodestr)
1027+
{
1028+
// Default Mapfile
1029+
ref_rendermode = MS_FIRST_MATCHING_CLASS;
1030+
}
1031+
else if (!strcmp(rendermodestr,"FIRST_MATCHING_CLASS"))
1032+
{
1033+
// Explicit default Mapfile
1034+
ref_rendermode = MS_FIRST_MATCHING_CLASS;
1035+
}
1036+
else if (!strcmp(rendermodestr,"ALL_MATCHING_CLASSES"))
1037+
{
1038+
// SLD-like Mapfile
1039+
ref_rendermode = MS_ALL_MATCHING_CLASSES;
1040+
}
1041+
else
1042+
{
1043+
msLayerClose(layer);
1044+
msSetError(MS_MISCERR,
1045+
"Unknown RENDERMODE: %s, should be one of: FIRST_MATCHING_CLASS, ALL_MATCHING_CLASSES.",
1046+
"msDrawVectorLayer()",
1047+
rendermodestr);
1048+
return MS_FAILURE;
1049+
}
10161050

10171051
/* step through the target shapes and their classes */
10181052
msInitShape(&shape);
@@ -1046,7 +1080,7 @@ int msDrawVectorLayer(mapObj *map, layerObj *layer, imageObj *image)
10461080
// i.e. only the first applicable class is actually applied. As a consequence,
10471081
// cache can be enabled when relevant.
10481082
classcount++;
1049-
rendermode = layer->rendermode;
1083+
rendermode = ref_rendermode;
10501084
if ((classcount == 1) && (msShapeGetNextClass(classindex, layer, map, &shape, classgroup, nclasses) == -1))
10511085
{
10521086
rendermode = MS_FIRST_MATCHING_CLASS;
60.9 KB
Loading

msautotest/sld/painter_reference.map

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
#
44
# RUN_PARMS: map_painter_reference.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3&REQUEST=GetMap&CRS=EPSG:4326&BBOX=42,-5,52,9&FORMAT=image/png&WIDTH=800&HEIGHT=800&LAYERS=multipolygon" > [RESULT_DEMIME]
55
#
6+
# RUN_PARMS: map_sldlike_painter_reference.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3&REQUEST=GetMap&CRS=EPSG:4326&BBOX=42,-5,52,9&FORMAT=image/png&WIDTH=800&HEIGHT=800&LAYERS=sldlike_multipolygon" > [RESULT_DEMIME]
7+
#
68
# RUN_PARMS: sld_painter_reference.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3&REQUEST=GetMap&CRS=EPSG:4326&BBOX=42,-5,52,9&FORMAT=image/png&WIDTH=800&HEIGHT=800&LAYERS=multipolygon&SLD_BODY=<StyledLayerDescriptor version=%221.1.0%22><NamedLayer><se:Name>multipolygon</se:Name><UserStyle><se:FeatureTypeStyle><se:Rule><se:Name>all_green</se:Name><se:PolygonSymbolizer><se:Fill><se:SvgParameter name=%22fill%22>#00ff00</se:SvgParameter></se:Fill><se:Stroke><se:SvgParameter name=%22stroke%22>#ffff00</se:SvgParameter><se:SvgParameter name=%22stroke-width%22>5.00</se:SvgParameter></se:Stroke></se:PolygonSymbolizer></se:Rule><se:Rule><se:Name>red_3_5</se:Name><ogc:Filter><ogc:And><ogc:PropertyIsLessThanOrEqualTo><ogc:PropertyName>N_EDGES</ogc:PropertyName><ogc:Literal>5</ogc:Literal></ogc:PropertyIsLessThanOrEqualTo><ogc:PropertyIsGreaterThanOrEqualTo><ogc:PropertyName>N_EDGES</ogc:PropertyName><ogc:Literal>3</ogc:Literal></ogc:PropertyIsGreaterThanOrEqualTo></ogc:And></ogc:Filter><se:PolygonSymbolizer><se:Fill><se:SvgParameter name=%22fill%22>#ff0000</se:SvgParameter></se:Fill><se:Stroke><se:SvgParameter name=%22stroke%22>#ffff00</se:SvgParameter><se:SvgParameter name=%22stroke-width%22>5.00</se:SvgParameter></se:Stroke></se:PolygonSymbolizer></se:Rule><se:Rule><se:Name>blue_quadrilateral</se:Name><ogc:Filter><ogc:PropertyIsEqualTo><ogc:PropertyName>N_EDGES</ogc:PropertyName><ogc:Literal>4</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Filter><se:PolygonSymbolizer><se:Fill><se:SvgParameter name=%22fill%22>#0000ff</se:SvgParameter></se:Fill><se:Stroke><se:SvgParameter name=%22stroke%22>#ffff00</se:SvgParameter><se:SvgParameter name=%22stroke-width%22>5.00</se:SvgParameter></se:Stroke></se:PolygonSymbolizer></se:Rule></se:FeatureTypeStyle></UserStyle></NamedLayer></StyledLayerDescriptor>" > [RESULT_DEMIME]
79
#
810

@@ -66,4 +68,40 @@ MAP
6668
END
6769
END
6870

71+
LAYER
72+
TYPE POLYGON
73+
NAME sldlike_multipolygon
74+
PROCESSING "RENDERMODE=ALL_MATCHING_CLASSES"
75+
CONNECTIONTYPE OGR
76+
CONNECTION data/set.json
77+
STATUS ON
78+
SIZEUNITS pixels
79+
CLASS
80+
NAME all_green
81+
STYLE
82+
WIDTH 5
83+
OUTLINECOLOR 255 255 0
84+
COLOR 0 255 0
85+
END
86+
END
87+
CLASS
88+
NAME red_3_5
89+
EXPRESSION ([N_EDGES] >= 3 and [N_EDGES] <= 5)
90+
STYLE
91+
WIDTH 5
92+
OUTLINECOLOR 255 255 0
93+
COLOR 255 0 0
94+
END
95+
END
96+
CLASS
97+
NAME blue_quadrilateral
98+
EXPRESSION ([N_EDGES] == 4)
99+
STYLE
100+
WIDTH 5
101+
OUTLINECOLOR 255 255 0
102+
COLOR 0 0 255
103+
END
104+
END
105+
END
106+
69107
END

0 commit comments

Comments
 (0)