Draw order of DEFAULT layers in WMS
Shawn Gervais
project10 at PROJECT10.NET
Wed Dec 5 13:50:43 EST 2007
Greetings list,
I noticed while playing with DEFAULT layers that they were being drawn
behind all my other layers. After looking at the code, I found that
mapwms.c will draw DEFAULT layers before any others, and does not
respect the draw order that the WMS client provides.
I think this violates the WMS 1.1.1 spec - 01-068r3 7.2.3.3 which states:
"A WMS shall render the requested layers by drawing the leftmost in the
list bottommost, the next one over that, and so on."
From the WMS client's perspective, it has no idea what a layer's STATUS is.
I have attached a patch which will respect the draw order for DEFAULT
layers, if they are specified in the LAYERS parameter. If they are not
specified, the old behavior is used. I would appreciate feedback, if
anyone has, on whether this is worthy of submitting as a ticket.
-Shawn
-------------- next part --------------
Index: mapwms.c
===================================================================
--- mapwms.c (revision 7141)
+++ mapwms.c (working copy)
@@ -425,11 +425,26 @@
for(j=0; j<map->numlayers; j++)
{
/* Keep only layers with status=DEFAULT by default */
- /* Layer with status DEFAULT is drawn first. */
+ /* Layer with status DEFAULT is drawn first, unless specified in the
+ /* LAYERS parameter. */
if (GET_LAYER(map, j)->status != MS_DEFAULT)
GET_LAYER(map, j)->status = MS_OFF;
- else
- map->layerorder[nLayerOrder++] = j;
+ else {
+ /* If this layer (of type MS_DEFAULT) is included in the layers list, */
+ /* don't set its layerorder yet, it will be done below. Otherwise draw */
+ /* this layer first */
+ layerfound = 0;
+ for (k=0; k<numlayers; k++) {
+ if (strcasecmp(GET_LAYER(map, j)->name, layers[k]) == 0) {
+ /* Layer is referenced in the LAYERS list, don't set it now */
+ layerfound = 1;
+ break;
+ }
+ }
+
+ if (!layerfound)
+ map->layerorder[nLayerOrder++] = j;
+ }
}
for (k=0; k<numlayers; k++)
@@ -449,9 +464,10 @@
layerfound = 1;
}
}
- if (layerfound == 0)
+ if (layerfound == 0) {
+ msDebug("msWMSLoadGetMapParams(): Unknown layer '%s' given in LAYERS parameter\n", layers[k]);
invalidlayers++;
-
+ }
}
/* set all layers with status off at end of array */
More information about the mapserver-users
mailing list