[OpenLayers-Dev] Re: multiple select controls on multiple layers in same map not working

Andy Deakin andy.deakin at pcmend.net
Fri Oct 1 15:27:26 EDT 2010


Hi crb,

I might have missed your point, but this works for me to have multiple 
layers selectable:

selectFeatures = new OpenLayers.Control.SelectFeature(
     [ layer1 , layer2 , layer3, layer4 ],
     {
         clickout: true,
         toggle: false,
         multiple: false,
         hover : true,
	onSelect : function(evt){
		// Show relevant popup
	},
	onUnselect : function(evt){
		// hide popup
	}
     }
);
map.addControl( selectFeatures );
selectFeatures.activate();


Hope this helps,

Andy

On 01/10/10 19:33, crb wrote:
> I see now  http://docs.openlayers.org/library/overlays.html#interaction in
> the docs  that having more than one selectable vector layer is unsupported.
> I can probably work around this, but am having trouble w/ another aspect of
> the solution I'm trying to implement, and that is having one vector layer (a
> "selected features" layer) display over the top of another "location
> features" layer. Even though the zIndex of the "selected features" layer is
> higher (as I can see when stepping through Map.js.setLayerZIndex()) it's
> still not displaying over the "location features" layer, even after a
> map.resetLayersZIndex().
>
> Maybe there's another way around what I'm trying to do, but I think getting
> the one vector feature to display over the top of the other will work.
>
> Ultimately the issue I'm trying to resolve is that having too many vector
> features in the map (hundreds at a time) slows the browser performance down
> too much (esp. IE, which is unusable).  We were originally loading all
> vector features on map init. We changed it so that:
>     - vector features only display at a specific, zoomed-in scale
>     - only the features in the current map extent are displayed (i.e. the
> callback to get the features is run on each map moveend event)
>     - features use a cluster strategy
>
> This all works fine.  Now the problem comes with selected features, which
> we'd like to show at *all* scales, since they should only ever be a small
> enough subset of all features that they don't affect browser performance,
> and they are visible to the user regardless of the scale that they switch
> to.  Originally we thought we would solve this by doing the following when a
> feature in the "location features" layer is selected:
> 1. clone the feature in the "location features" layer and add it to the
> "selected features" layer (which has a higher zIndex), hoping that the
> feature in the "selected features" layer would display over the top of the
> locations layer
> 2. show a popup on the feature (has to be the "location features" layer
> since only it can have an associated SelectFeatures control)
>
> When unselecting the feature:
> 1. delete the cloned feature from the "selected features" layer
> 2. close the popup
>
> As you can see, this only works if the "selected features" layer actually
> displays over the top of the "location features" layer.  Not sure yet if the
> 'selected' event will fire on the "location features" layer if the "selected
> features" layer (eventually) overlays it.
>
> What's not working:
> - when selecting a single (non-clustered) feature in the "location features"
> layer:
>       * all features in that layer briefly disappear
>       * the newly-added feature in the "selected features" layer briefly
> appears
>       * the popup appears
>       * the "location features" layer overlays the "selected features" layer
> If I turn off the "location features" layer, I see this first feature (only)
> in the "selected features" layer
> - only the first single selected feature is added to the "selected featues"
> layer: subsequently-selected single features are not (even though when
> debugging I can clearly see the call to
> 'selsLayerDef.addFeatures([feature])' executed)
> - when clustered features in the "location features" layer are selected,
> they are not added to the "selected features" layer, even though when
> selecting them I can see the array getting added:
>
> for (var i = 0; i<  feature.cluster.length; i++) {
>     hFeatures.push(feature.cluster[i].clone());
> }
> selsLayerDef.addFeatures(hFeatures);
>
> - on the SelectFeature control, both 'clickout' and 'toggle' are set to
> 'true', but when I do either in the map then the function associated with
> onUnselect does not fire
>
> Should I be going about this a different way?
>
>    



More information about the Dev mailing list