Skip to content

Commit 85fcbdd

Browse files
committed
Implement SLD "painter's model"
1 parent 2b80a45 commit 85fcbdd

9 files changed

+81
-10
lines changed

mapcopy.c

+2
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,7 @@ int msCopyClass(classObj *dst, classObj *src, layerObj *layer)
541541
}
542542

543543
MS_COPYSTELEM(status);
544+
MS_COPYSTELEM(isfallback);
544545

545546
/* free any previous styles on the dst layer */
546547
for(i=0; i<dst->numstyles; i++) { /* each style */
@@ -1033,6 +1034,7 @@ int msCopyLayer(layerObj *dst, layerObj *src)
10331034
MS_COPYSTRING(dst->data, src->data);
10341035
MS_COPYSTRING(dst->encoding, src->encoding);
10351036

1037+
MS_COPYSTELEM(rendermode);
10361038
MS_COPYSTELEM(status);
10371039
MS_COPYSTELEM(type);
10381040
MS_COPYSTELEM(tolerance);

mapdraw.c

+48-4
Original file line numberDiff line numberDiff line change
@@ -924,11 +924,11 @@ int msDrawVectorLayer(mapObj *map, layerObj *layer, imageObj *image)
924924
int drawmode=MS_DRAWMODE_FEATURES;
925925
char annotate=MS_TRUE;
926926
shapeObj shape;
927+
shapeObj savedShape;
927928
rectObj searchrect;
928929
char cache=MS_FALSE;
929930
int maxnumstyles=1;
930931
featureListNodeObjPtr shpcache=NULL, current=NULL;
931-
int classindex = -1;
932932
int nclasses = 0;
933933
int *classgroup = NULL;
934934
double minfeaturesize = -1;
@@ -1016,8 +1016,10 @@ int msDrawVectorLayer(mapObj *map, layerObj *layer, imageObj *image)
10161016

10171017
/* step through the target shapes and their classes */
10181018
msInitShape(&shape);
1019-
classindex = -1;
1019+
int classindex = -1;
1020+
int classcount = 0;
10201021
for (;;) {
1022+
int rendermode;
10211023
if (classindex == -1) {
10221024
status = msLayerNextShape(layer, &shape);
10231025
if (status != MS_SUCCESS) {
@@ -1030,15 +1032,29 @@ int msDrawVectorLayer(mapObj *map, layerObj *layer, imageObj *image)
10301032
msDebug("msDrawVectorLayer(): Skipping shape (%ld) because LAYER::MINFEATURESIZE is bigger than shape size\n", shape.index);
10311033
continue;
10321034
}
1035+
classcount = 0;
10331036
}
10341037

10351038
classindex = msShapeGetNextClass(classindex, layer, map, &shape, classgroup, nclasses);
10361039
if((classindex == -1) || (layer->class[classindex]->status == MS_OFF)) {
10371040
continue;
10381041
}
10391042
shape.classindex = classindex;
1040-
classindex = -1; // This value indicates that no more class is to be
1041-
// fetched from current shape
1043+
1044+
// When only one class is applicable, rendering mode is forced to its default,
1045+
// i.e. only the first applicable class is actually applied. As a consequence,
1046+
// cache can be enabled when relevant.
1047+
classcount++;
1048+
rendermode = layer->rendermode;
1049+
if ((classcount == 1) && (msShapeGetNextClass(classindex, layer, map, &shape, classgroup, nclasses) == -1))
1050+
{
1051+
rendermode = MS_FIRST_MATCHING_CLASS;
1052+
}
1053+
1054+
if (rendermode == MS_FIRST_MATCHING_CLASS)
1055+
{
1056+
classindex = -1;
1057+
}
10421058

10431059
if(maxfeatures >=0 && featuresdrawn >= maxfeatures) {
10441060
status = MS_DONE;
@@ -1077,6 +1093,13 @@ int msDrawVectorLayer(mapObj *map, layerObj *layer, imageObj *image)
10771093
cache = MS_FALSE;
10781094
}
10791095

1096+
if (rendermode == MS_ALL_MATCHING_CLASSES)
1097+
{
1098+
// Cache is designed to handle only one class. Therefore it is
1099+
// disabled when using SLD "painters model" rendering mode.
1100+
cache = MS_FALSE;
1101+
}
1102+
10801103
/* RFC77 TODO: check return value, may need a more sophisticated if-then test. */
10811104
if(annotate && layer->class[shape.classindex]->numlabels > 0) {
10821105
drawmode |= MS_DRAWMODE_LABELS;
@@ -1089,6 +1112,16 @@ int msDrawVectorLayer(mapObj *map, layerObj *layer, imageObj *image)
10891112
drawmode |= MS_DRAWMODE_UNCLIPPEDLINES;
10901113
}
10911114

1115+
if (rendermode == MS_ALL_MATCHING_CLASSES)
1116+
{
1117+
// In SLD "painters model" rendering mode, all applicable classes are actually applied.
1118+
// Coordinates stored in the shape must keep their original values for
1119+
// the shape to be drawn multiple times.
1120+
// Here the original shape is saved.
1121+
msInitShape(&savedShape);
1122+
msCopyShape(&shape, &savedShape);
1123+
}
1124+
10921125
if (cache) {
10931126
styleObj *pStyle = layer->class[shape.classindex]->styles[0];
10941127
if (pStyle->outlinewidth > 0) {
@@ -1115,6 +1148,17 @@ int msDrawVectorLayer(mapObj *map, layerObj *layer, imageObj *image)
11151148

11161149
else
11171150
status = msDrawShape(map, layer, &shape, image, -1, drawmode); /* all styles */
1151+
1152+
if (rendermode == MS_ALL_MATCHING_CLASSES)
1153+
{
1154+
// In SLD "painters model" rendering mode, all applicable classes are actually applied.
1155+
// Coordinates stored in the shape must keep their original values for
1156+
// the shape to be drawn multiple times.
1157+
// Here the original shape is restored.
1158+
msCopyShape(&savedShape, &shape);
1159+
msFreeShape(&savedShape);
1160+
}
1161+
11181162
if(status != MS_SUCCESS) {
11191163
retcode = MS_FAILURE;
11201164
break;

mapfile.c

+2
Original file line numberDiff line numberDiff line change
@@ -2829,6 +2829,7 @@ int initClass(classObj *class)
28292829
class->status = MS_ON;
28302830
class->debug = MS_OFF;
28312831
MS_REFCNT_INIT(class);
2832+
class->isfallback = FALSE;
28322833

28332834
msInitExpression(&(class->expression));
28342835
class->name = NULL;
@@ -3507,6 +3508,7 @@ int initLayer(layerObj *layer, mapObj *map)
35073508
layer->group = NULL;
35083509
layer->status = MS_OFF;
35093510
layer->data = NULL;
3511+
layer->rendermode = MS_FIRST_MATCHING_CLASS;
35103512

35113513
layer->map = map; /* point back to the encompassing structure */
35123514

mapogcsld.c

+2
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ int msSLDApplySLD(mapObj *map, const char *psSLDXML, int iLayer, const char *psz
235235
int bSLDHasNamedClass = MS_FALSE;
236236

237237
lp->type = sldLayer->type;
238+
lp->rendermode = MS_ALL_MATCHING_CLASSES;
238239

239240
for (k=0; k < sldLayer->numclasses; k++) {
240241
if( sldLayer->class[k]->group ) {
@@ -826,6 +827,7 @@ static void msSLDParseUserStyle(CPLXMLNode* psUserStyle, layerObj *psLayer)
826827
if (psElseFilter) {
827828
msSLDParseRule(psRule, psLayer, pszUserStyleName);
828829
_SLDApplyRuleValues(psRule, psLayer, 1);
830+
psLayer->class[psLayer->numclasses-1]->isfallback = TRUE;
829831
}
830832
}
831833
}

mapserver.h

+6
Original file line numberDiff line numberDiff line change
@@ -489,6 +489,7 @@ extern "C" {
489489
enum MS_SHAPE_TYPE {MS_SHAPE_POINT, MS_SHAPE_LINE, MS_SHAPE_POLYGON, MS_SHAPE_NULL};
490490
enum MS_LAYER_TYPE {MS_LAYER_POINT, MS_LAYER_LINE, MS_LAYER_POLYGON, MS_LAYER_RASTER, MS_LAYER_ANNOTATION /* only used for parser backwards compatibility */, MS_LAYER_QUERY, MS_LAYER_CIRCLE, MS_LAYER_TILEINDEX, MS_LAYER_CHART};
491491
enum MS_FONT_TYPE {MS_TRUETYPE, MS_BITMAP};
492+
enum MS_RENDER_MODE {MS_FIRST_MATCHING_CLASS, MS_ALL_MATCHING_CLASSES};
492493

493494
#define MS_POSITIONS_LENGTH 14
494495
enum MS_POSITIONS_ENUM {MS_UL=101, MS_LR, MS_UR, MS_LL, MS_CR, MS_CL, MS_UC, MS_LC, MS_CC, MS_AUTO, MS_XY, MS_NONE, MS_AUTO2,MS_FOLLOW};
@@ -1182,6 +1183,8 @@ typedef struct labelObj labelObj;
11821183
#endif
11831184

11841185
int status;
1186+
int isfallback; // TRUE if this class should be applied if and only if
1187+
// no other class is applicable (e.g. SLD <ElseFilter/>)
11851188

11861189
#ifndef SWIG
11871190
styleObj **styles;
@@ -1647,6 +1650,9 @@ typedef struct labelObj labelObj;
16471650
char *group; /* shouldn't be unique it's supposed to be a group right? */
16481651

16491652
int status; /* on or off */
1653+
enum MS_RENDER_MODE rendermode;
1654+
// MS_FIRST_MATCHING_CLASS: Default and historic MapServer behavior
1655+
// MS_ALL_MATCHING_CLASSES: SLD behavior
16501656

16511657
#ifndef SWIG
16521658
/* RFC86 Scale-dependent token replacements */

maputil.c

+12-1
Original file line numberDiff line numberDiff line change
@@ -698,7 +698,18 @@ int msShapeGetNextClass(int currentclass, layerObj *layer, mapObj *map,
698698
}
699699

700700
if(layer->class[iclass]->status != MS_DELETE && msEvalExpression(layer, shape, &(layer->class[iclass]->expression), layer->classitemindex) == MS_TRUE)
701-
return(iclass);
701+
{
702+
if (layer->class[iclass]->isfallback && currentclass != -1)
703+
{
704+
// Class is not applicable if it is flagged as fallback (<ElseFilter/> tag in SLD)
705+
// but other classes have been applied before.
706+
return -1;
707+
}
708+
else
709+
{
710+
return(iclass);
711+
}
712+
}
702713
}
703714
}
704715

Loading

msautotest/sld/painter_reference.map

+5-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
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: 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: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:PolygonSymbolizer></se:Rule></se:FeatureTypeStyle></UserStyle></NamedLayer></StyledLayerDescriptor>" > [RESULT_DEMIME]
6+
# 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]
77
#
88

99

@@ -50,13 +50,17 @@ MAP
5050
NAME red_3_5
5151
EXPRESSION ([N_EDGES] >= 3 and [N_EDGES] <= 5)
5252
STYLE
53+
WIDTH 5
54+
OUTLINECOLOR 255 255 0
5355
COLOR 255 0 0
5456
END
5557
END
5658
CLASS
5759
NAME blue_quadrilateral
5860
EXPRESSION ([N_EDGES] == 4)
5961
STYLE
62+
WIDTH 5
63+
OUTLINECOLOR 255 255 0
6064
COLOR 0 0 255
6165
END
6266
END

msautotest/sld/sld_named_userstyle.map

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
#
22
# REQUIRES: INPUT=GDAL OUTPUT=PNG SUPPORTS=WMS
33

4-
# No IsDefault in SLD, and no STYLES= parameter ==> will use the first UserStyle, that is red
5-
# RUN_PARMS: sld_named_userstyle_1.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=200&HEIGHT=200&LAYERS=lline&SLD_BODY=<StyledLayerDescriptor version='1.1.0'><NamedLayer><Name>lline</Name><UserStyle><Name>red</Name><FeatureTypeStyle><Rule><LineSymbolizer><Stroke><SvgParameter name='stroke-width'>5</SvgParameter><SvgParameter name='stroke-opacity'>0.5</SvgParameter><SvgParameter name='stroke'>#FF0000</SvgParameter></Stroke></LineSymbolizer></Rule></FeatureTypeStyle></UserStyle><UserStyle><Name>green</Name><FeatureTypeStyle><Rule><LineSymbolizer><Stroke><SvgParameter name='stroke-width'>3</SvgParameter><SvgParameter name='stroke-opacity'>0.5</SvgParameter><SvgParameter name='stroke'>#00FF00</SvgParameter></Stroke></LineSymbolizer></Rule></FeatureTypeStyle></UserStyle></NamedLayer></StyledLayerDescriptor>" > [RESULT_DEMIME]
4+
# No IsDefault in SLD, and no STYLES= parameter ==> will use all applicables UserStyle, that is blue on top of green on top of red
5+
# RUN_PARMS: sld_named_userstyle_1.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=200&HEIGHT=200&LAYERS=lline&SLD_BODY=<StyledLayerDescriptor version='1.1.0'><NamedLayer><Name>lline</Name><UserStyle><Name>red</Name><FeatureTypeStyle><Rule><LineSymbolizer><Stroke><SvgParameter name='stroke-width'>5</SvgParameter><SvgParameter name='stroke-opacity'>0.5</SvgParameter><SvgParameter name='stroke'>#FF0000</SvgParameter></Stroke></LineSymbolizer></Rule></FeatureTypeStyle></UserStyle><UserStyle><Name>green</Name><FeatureTypeStyle><Rule><LineSymbolizer><Stroke><SvgParameter name='stroke-width'>3</SvgParameter><SvgParameter name='stroke-opacity'>0.5</SvgParameter><SvgParameter name='stroke'>#00FF00</SvgParameter></Stroke></LineSymbolizer></Rule></FeatureTypeStyle></UserStyle><UserStyle><Name>blue</Name><FeatureTypeStyle><Rule><LineSymbolizer><Stroke><SvgParameter name='stroke-width'>1</SvgParameter><SvgParameter name='stroke-opacity'>0.5</SvgParameter><SvgParameter name='stroke'>#0000FF</SvgParameter></Stroke></LineSymbolizer></Rule></FeatureTypeStyle></UserStyle></NamedLayer></StyledLayerDescriptor>" > [RESULT_DEMIME]
66
#
77
# Selection of class with STYLES=green
8-
# RUN_PARMS: sld_named_userstyle_2.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=200&HEIGHT=200&LAYERS=lline&STYLES=green&SLD_BODY=<StyledLayerDescriptor version='1.1.0'><NamedLayer><Name>lline</Name><UserStyle><Name>red</Name><FeatureTypeStyle><Rule><LineSymbolizer><Stroke><SvgParameter name='stroke-width'>5</SvgParameter><SvgParameter name='stroke-opacity'>0.5</SvgParameter><SvgParameter name='stroke'>#FF0000</SvgParameter></Stroke></LineSymbolizer></Rule></FeatureTypeStyle></UserStyle><UserStyle><Name>green</Name><FeatureTypeStyle><Rule><LineSymbolizer><Stroke><SvgParameter name='stroke-width'>3</SvgParameter><SvgParameter name='stroke-opacity'>0.5</SvgParameter><SvgParameter name='stroke'>#00FF00</SvgParameter></Stroke></LineSymbolizer></Rule></FeatureTypeStyle></UserStyle></NamedLayer></StyledLayerDescriptor>" > [RESULT_DEMIME]
8+
# RUN_PARMS: sld_named_userstyle_2.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=200&HEIGHT=200&LAYERS=lline&STYLES=green&SLD_BODY=<StyledLayerDescriptor version='1.1.0'><NamedLayer><Name>lline</Name><UserStyle><Name>red</Name><FeatureTypeStyle><Rule><LineSymbolizer><Stroke><SvgParameter name='stroke-width'>5</SvgParameter><SvgParameter name='stroke-opacity'>0.5</SvgParameter><SvgParameter name='stroke'>#FF0000</SvgParameter></Stroke></LineSymbolizer></Rule></FeatureTypeStyle></UserStyle><UserStyle><Name>green</Name><FeatureTypeStyle><Rule><LineSymbolizer><Stroke><SvgParameter name='stroke-width'>3</SvgParameter><SvgParameter name='stroke-opacity'>0.5</SvgParameter><SvgParameter name='stroke'>#00FF00</SvgParameter></Stroke></LineSymbolizer></Rule></FeatureTypeStyle></UserStyle><UserStyle><Name>blue</Name><FeatureTypeStyle><Rule><LineSymbolizer><Stroke><SvgParameter name='stroke-width'>1</SvgParameter><SvgParameter name='stroke-opacity'>0.5</SvgParameter><SvgParameter name='stroke'>#0000FF</SvgParameter></Stroke></LineSymbolizer></Rule></FeatureTypeStyle></UserStyle></NamedLayer></StyledLayerDescriptor>" > [RESULT_DEMIME]
99
#
1010
# Selection of class with IsDefault set on the 'green' UserStyle
11-
# RUN_PARMS: sld_named_userstyle_3.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=200&HEIGHT=200&LAYERS=lline&SLD_BODY=<StyledLayerDescriptor version='1.1.0'><NamedLayer><Name>lline</Name><UserStyle><Name>red</Name><FeatureTypeStyle><Rule><LineSymbolizer><Stroke><SvgParameter name='stroke-width'>5</SvgParameter><SvgParameter name='stroke-opacity'>0.5</SvgParameter><SvgParameter name='stroke'>#FF0000</SvgParameter></Stroke></LineSymbolizer></Rule></FeatureTypeStyle></UserStyle><UserStyle><Name>green</Name><IsDefault>true</IsDefault><FeatureTypeStyle><Rule><LineSymbolizer><Stroke><SvgParameter name='stroke-width'>3</SvgParameter><SvgParameter name='stroke-opacity'>0.5</SvgParameter><SvgParameter name='stroke'>#00FF00</SvgParameter></Stroke></LineSymbolizer></Rule></FeatureTypeStyle></UserStyle></NamedLayer></StyledLayerDescriptor>" > [RESULT_DEMIME]
11+
# RUN_PARMS: sld_named_userstyle_3.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=200&HEIGHT=200&LAYERS=lline&SLD_BODY=<StyledLayerDescriptor version='1.1.0'><NamedLayer><Name>lline</Name><UserStyle><Name>red</Name><FeatureTypeStyle><Rule><LineSymbolizer><Stroke><SvgParameter name='stroke-width'>5</SvgParameter><SvgParameter name='stroke-opacity'>0.5</SvgParameter><SvgParameter name='stroke'>#FF0000</SvgParameter></Stroke></LineSymbolizer></Rule></FeatureTypeStyle></UserStyle><UserStyle><Name>green</Name><IsDefault>true</IsDefault><FeatureTypeStyle><Rule><LineSymbolizer><Stroke><SvgParameter name='stroke-width'>3</SvgParameter><SvgParameter name='stroke-opacity'>0.5</SvgParameter><SvgParameter name='stroke'>#00FF00</SvgParameter></Stroke></LineSymbolizer></Rule></FeatureTypeStyle></UserStyle><UserStyle><Name>blue</Name><FeatureTypeStyle><Rule><LineSymbolizer><Stroke><SvgParameter name='stroke-width'>1</SvgParameter><SvgParameter name='stroke-opacity'>0.5</SvgParameter><SvgParameter name='stroke'>#0000FF</SvgParameter></Stroke></LineSymbolizer></Rule></FeatureTypeStyle></UserStyle></NamedLayer></StyledLayerDescriptor>" > [RESULT_DEMIME]
1212
#
1313

1414
MAP

0 commit comments

Comments
 (0)