[OpenLayers-Users] Re: help with implementing controls on several
vector layers
Mr. Puneet Kishor
punk.kish at gmail.com
Sat Sep 24 23:23:36 EDT 2011
adding more to my own post --
On Sep 24, 2011, at 9:28 PM, Mr. Puneet Kishor wrote:
> more info below --
>
> On Sep 24, 2011, at 7:59 PM, Mr. Puneet Kishor wrote:
>
>>
>> I am not able to get select and highlight controls working for vector layers. I am using the following (pseudo)code and approach. Please help me identify the errors of my ways.
>>
>> Since I am adding several vector layers, each getting its own set of attributes, I have my simplified addLayer() method as below. Needless to say, the select, highlight and popup controls are not working. The layers draw correctly, and I get no javascript errors.
>>
>> var map;
>>
>> // repeat addLayer for several layers
>> addLayer({url: url, name: name1, styleMap: styleMapObj});
>> addLayer({url: url, name: name2, styleMap: styleMapObj});
>> addLayer({url: url, name: name3, styleMap: styleMapObj});
>> ..
>>
>> "onPopupClose" : function(evt) {
>> if (this.feature.layer) {
>> selectControl.unselect(this.feature);
>> }
>> else {
>> this.destroy();
>> }
>> },
>>
>> "addLayer" : function(a) {
>> $.ajax({
>> url: a.url + a.name + ".json",
>> type: "GET",
>> success: function(data) {
>> var geojson_format = new OpenLayers.Format.GeoJSON();
>> var lyr = new OpenLayers.Layer.Vector(a.name, {styleMap: a.styleMap});
>> map.addLayer(lyr);
>> lyr.addFeatures(geojson_format.read(data[a.name]));
>>
>> var highlightCtrl = new OpenLayers.Control.SelectFeature(lyr, {
>> hover: true,
>> highlightOnly: true,
>> renderIntent: "temporary"
>> });
>>
>> var selectCtrl = new OpenLayers.Control.SelectFeature(lyr, {clickout: true});
>>
>> map.addControl(highlightCtrl);
>> map.addControl(selectCtrl);
>>
>> highlightCtrl.activate();
>> selectCtrl.activate();
>>
>> lyr.events.on({
>> "featureselected": function(evt) {
>> feature = evt.feature;
>> var str = "";
>> for (var i in feature.attributes) {
>> str += "<b>" + i + ":</b> " + feature.attributes[i] + "<br />";
>> }
>>
>> popup = new OpenLayers.Popup.FramedCloud(
>> "featurePopup",
>> feature.geometry.getBounds().getCenterLonLat(),
>> new OpenLayers.Size(300,250),
>> str,
>> null,
>> true,
>> onPopupClose
>> );
>> feature.popup = popup;
>> popup.feature = feature;
>> map.addPopup(popup, true);
>> },
>> "featureunselected": function(evt) {
>> feature = evt.feature;
>> if (feature.popup) {
>> popup.feature = null;
>> map.removePopup(feature.popup);
>> feature.popup.destroy();
>> feature.popup = null;
>> }
>> }
>> });
>>
>> }
>> });
>> };
>
>
> So, reading more about SelectFeature, I can add multiple layers to it. So, I have moved my control creation code outside layer creation. Still, my problem may be that the layers are being created asynchronously, so I don't have an array of layers ready when I am creating the control. This creates a problem for me, unless there is a way around.
>
> An additional issue -- once I have created a SelectFeature control, how do I add a new layer to it? The docs provide the control.setLayer method, but say that it would "Attach a new layer to the control, overriding any existing layers." Hmmmm... I don't want to destroy any existing layer. I want to add the new layer to the existing layers, so features on all the layers may be selectable/highlightable/popupWindowable.
>
Yup. The above was the issue. If I keep track of the layers added, pushing them in an array, and add the array of layers to the SelectFeature control *after* all the layers have been added, the control works. So far so good. However, this leaves me with a problem when I add another layer. How do I add the new layer to the already added SelectFeature control without destroying the control for the existing layers? In fact, I will be removing layers and adding new layers several times, and all new layers have to be selectable. What to do?
Puneet.
More information about the Users
mailing list