[OpenLayers-Dev] Bug in using graphicZIndex ?

Vivien Deparday vivien.deparday at gmail.com
Thu Apr 16 14:49:58 EDT 2009


Hi all,

I'm trying to set different graphicZIndex for my polygons, lines, and 
points so that my points are on top of my lines which are on top of my 
polygons. All the features are within the same vector layer (code 
below). This layer has a stylemap with a context property to return 
different values of the graphicZIndex property according to the geometry 
type.
When, I inspect the dom with firebug, I can see that each feature has 
the right graphicZIndex. However, in the display, the z order is still 
the same as the drawing order (some features with bigger graphicZIndex 
are under some with a lower).
If I set "rendererOptions: {yOrdering: true}", then it works.
The same thing can be reproduced in the ordering example 
(http://openlayers.org/dev/examples/ordering.html). If you comment  the 
yOrdering: true, the red features are not ordered according to their 
z-index but only according the drawing order.

However, if I correctly understand the documentation and with a quick 
look at the code in /renderer/elements.js, the z ordering is supposed to 
be activated by default ( to use the Z_ORDER_DRAWING_ORDER  comparing 
method) and the yOrdering property is supposed to be necessary only for 
y ordering (to use the Z_ORDER_Y_ORDER  comparing method).
<http://dev.openlayers.org/docs/files/OpenLayers/Renderer/Elements-js.html#OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER_Y_ORDER>
Am I misunderstanding something in the way it should work? or is there a 
bug? and yOrdering: true should not be necessary for zOrdering?

Here is the stylemap and the layer creation code:
   
        var styleMap = new OpenLayers.StyleMap({
            'default': new OpenLayers.Style({
                fillColor: '${fillColor}',
                fillOpacity: 0.8,
                 strokeColor: '${strokeColor}',
                 strokeWidth: 2,
                 strokeOpacity: 0.8,
                pointRadius:'2',
                externalGraphic: "${getChartURL}",
                graphicZIndex: "${getZIndex}"
                },
             {
                    fillColor: function(feature){
                        return feature.cluster ? '#00c600' : '#fde500';
                    },
                    strokeColor: function(feature){
                        return feature.cluster ? '#096d09' : '#e76e1b';
                    },
                    getChartURL: function(feature){
                        return '';
                    },
                    getZIndex: function(feature){
                        var zIndex=map.Z_INDEX_BASE['Overlay'];
                       
                        if(feature.geometry.CLASS_NAME === 
"OpenLayers.Geometry.LineString")
                        {
                            var zIndex = map.Z_INDEX_BASE['Overlay']+1;
                        }
                        else if (feature.geometry.CLASS_NAME === 
"OpenLayers.Geometry.Point")
                        {
                            var zIndex = map.Z_INDEX_BASE['Overlay']+2;
                        }
                        else if (feature.geometry.CLASS_NAME === 
"OpenLayers.Geometry.Polygon")
                        {
                            var zIndex = map.Z_INDEX_BASE['Overlay'];
                        }
               
                        return zIndex;
                    }
                 }
             })
        });
   
    vectors = new OpenLayers.Layer.Vector("Assets", {
            styleMap: styleMap,
            strategies: [
                    new OpenLayers.Strategy.Cluster({distance:40, 
threshold:2, autoActivate:false, clusterOnActivate: true}),
                    new OpenLayers.Strategy.Fixed()
                ],
                protocol: new OpenLayers.Protocol.HTTP({
                    url: "http://localhost:8080/geoserver/wfs",
                    params: {
                        request: "GetFeature",
                        typename: "mcviz:assets_json",
                        outputformat: "json"
                    } ,
                    format: new OpenLayers.Format.GeoJSON({
                        externalProjection: new 
OpenLayers.Projection('EPSG:26909'),
                        internalProjection: map.getProjectionObject()    
           
                    })
                   
                }),
            eventListeners: {
                'loadend': onLoadEnd
            },
             // Works with it, does not work without
            rendererOptions: {yOrdering: true}
        })

Thanks,

Vivien






More information about the Dev mailing list