ThinkGeo.com    |     Documentation    |     Premium Support

How can I add/remove featurelayer dynamically

My program will have some based featurelayers that will load on start page. Some optional featurelayers will load on user choice.


I want to have a selected featurelayers. User will choose one or more featurelayers to load on map (like Map Suite Explorer).


I want to do this on client side (if can). If do it on server side, can has a solution that I do not reload all of preloaded layers?



Any support???

 Hello duong,


 
Sorry for waiting, yes, you can do this both, the key is you have the initialized overlay before user load the layer, then load your layer in your overlay, and you can choose refresh this single overlay from client side or server side.
 
Client side code:

map.getLayer(overlayname).redraw(true);

Server side code:

layerOverlay.Redraw();

Regards,
 
Gary

Hi Gary, I can add more layer but the next layer is seem to be overlapped by older layer. Please provide me an example about add/remove layer on client. 
 Thanks alot.

Hello duong, 
  
 Could you please show me some of your code? 
  
 Thanks, 
  
 Gary

Hi Gary, 
 Firstly, I 've loaded a groupLayer as a based layer from server site. 
 public static void AddBasedMap(Map map) 
         { 
             map.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#B3C6D4")); 
             map.MapUnit = GeographyUnit.DecimalDegree; 
  
             map.MapTools.MouseCoordinate.Enabled = true; 
             map.MapTools.MouseCoordinate.MouseCoordinateType = MouseCoordinateType.DegreesMinutesSecondsLatitudeLongitude; 
  
             map.MapTools.MouseMapTool.Enabled = true; 
             map.MapTools.ScaleLine.Enabled = true; 
  
             map.MapTools.PanZoomBar.Enabled = false; 
             map.MapTools.PanZoom.Enabled = true; 
             map.MapTools.AnimationPanMapTool.Enabled = false; 
             map.MapTools.Logo.Enabled = false; 
  
             map.MapTools.LoadingImage.Enabled = true; 
             map.MapTools.LoadingImage.Width = 105; 
             map.MapTools.LoadingImage.Height = 16; 
             map.MapTools.LoadingImage.ImageUri = new Uri(new Uri(HttpContext.Current.Request.Url.AbsoluteUri), “loading.gif”); 
  
             WmsOverlay wmsOverlay = new WmsOverlay(“NYC”, new Uri(“192.168.1.101:8981/geoserver/wms”)); 
             wmsOverlay.Parameters.Add(“LAYERS”, “BanDoNen”); 
             map.CustomOverlays.Add(wmsOverlay); 
             double scale = double.Parse(DataCache.GetSetting(“MapvalueCurrentScale”, “500000”)); 
      double x = double.Parse(DataCache.GetSetting(“MapvalueCenterLongitude”, “116”)); 
      double y = double.Parse(DataCache.GetSetting(“MapvalueCenterLatitude”, “16”)); 
  
      map.CurrentScale = scale; 
      map.CenterAt(x, y);           
         } 
 On client site, when user choose a layer from checkbox. I 'll call function code: 
             var olMap = MainMap.GetOpenLayersMap(); 
      var wmsLayer = new OpenLayers.Layer.WMS(“NewLayer”, “192.168.1.101:8981/geoserver/elcomWS/wms”, {layers:‘elcomWS:Blocks’ }); 
      olMap.addLayer(wmsLayer); 
      olMap.SetCenter(116, 16); 
      olMap.CurrentScale = 500000; 
             olMap.redraw(true); 
 => New layer is seem to be overlapped. 
  
 If I used: 
      var oldLayer = olMap.getLayer(“NYC”); 
      oldLayer.destroy(); 
 to remove basedLayer firstly, I’ll see the display of new layer. 
  
  


Up!!!

Hi duong, 
  
 I think you can try to set layer index for that. This Openlayers API setLayerIndex should be helpful. 
  
 I found two helpful links for you: 
 stackoverflow.com/questions/4728852/forcing-an-openlayers-markers-layer-to-draw-on-top-and-having-selectable-layers 
 gis.stackexchange.com/questions/15238/how-to-define-layer-order-in-openlayers 
  
 And why not add your layer background then set visible in client side for it? 
  
 Regards, 
  
 Don 
  


Hi duong, 
  
 I think you can try to set layer index for that. This Openlayers API setLayerIndex should be helpful. 
  
 I found two helpful links for you: 
 stackoverflow.com/questions/4728852/forcing-an-openlayers-markers-layer-to-draw-on-top-and-having-selectable-layers 
 gis.stackexchange.com/questions/15238/how-to-define-layer-order-in-openlayers 
  
 And why not add your layer background then set visible in client side for it? 
  
 Regards, 
  
 Don 
  


Hi Don, 
 I have 2 layers (Load using WmsOverlay), I set the second layer isVisible = false. 
 When I check to choose the second layer on OverlaySwitcher, the second layer is displayed but it overlaps the first layer. I have some layers used InMemoryFeatureLayer which are contained on Overlay of OverlaySwitcher and they don’t overlay any layers. 
  
 => How can i treat the second layer as InMemoryFeatureLayer ??? 
 This my source: 
 public static void AddBasedMap(Map map) 
         { 
             map.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#B3C6D4")); 
             map.MapUnit = GeographyUnit.DecimalDegree; 
  
             map.MapTools.MouseCoordinate.Enabled = true; 
             map.MapTools.MouseCoordinate.MouseCoordinateType = MouseCoordinateType.DegreesMinutesSecondsLatitudeLongitude; 
  
             map.MapTools.MouseMapTool.Enabled = true; 
             map.MapTools.ScaleLine.Enabled = true; 
  
             map.MapTools.PanZoomBar.Enabled = false; 
             map.MapTools.PanZoom.Enabled = true; 
             map.MapTools.AnimationPanMapTool.Enabled = false; 
             map.MapTools.Logo.Enabled = false; 
  
             map.MapTools.LoadingImage.Enabled = true; 
             map.MapTools.LoadingImage.Width = 105; 
             map.MapTools.LoadingImage.Height = 16; 
             map.MapTools.LoadingImage.ImageUri = new Uri(new Uri(HttpContext.Current.Request.Url.AbsoluteUri), “loading.gif”); 
             map.MapTools.OverlaySwitcher.Enabled = true; 
  
  
             WmsOverlay wmsOverlay = new WmsOverlay(“NYC”, new Uri(“192.168.1.203:8781/geoserver/wms”)); 
             wmsOverlay.Parameters.Add(“LAYERS”, “BanDoNen”); 
             //wmsOverlay.IsVisible = true; 
             wmsOverlay.IsBaseOverlay = true; 
             wmsOverlay.IsVisibleInOverlaySwitcher = false; 
             map.CustomOverlays.Add(wmsOverlay); 
  
  
             WmsOverlay wmsOverlay1 = new WmsOverlay(“Block”, new Uri(“192.168.1.203:8781/geoserver/elcomWS/wms”)); 
             wmsOverlay1.Parameters.Add(“LAYERS”, “elcomWS:Blocks”); 
             wmsOverlay1.IsBaseOverlay = false; 
             wmsOverlay1.IsVisibleInOverlaySwitcher = true; 
             wmsOverlay1.IsVisible = false; 
             map.CustomOverlays.Add(wmsOverlay1); 
              
         } 
  
 protected void AddAreaLayer(Map map) { 
  InMemoryFeatureLayer shapeFeatureLayer = new InMemoryFeatureLayer(); 
  shapeFeatureLayer.FeatureSource.Open(); 
  shapeFeatureLayer.Columns.Add(new FeatureSourceColumn(AREA_ID_PROPERTY_NAME)); 
  shapeFeatureLayer.Columns.Add(new FeatureSourceColumn(AREA_NAME_PROPERTY_NAME)); 
  shapeFeatureLayer.DrawingQuality = DrawingQuality.HighQuality; 
  
  InMemoryFeatureLayer labelFeatureLayer = new InMemoryFeatureLayer(); 
  labelFeatureLayer.FeatureSource.Open(); 
  labelFeatureLayer.Columns.Add(new FeatureSourceColumn(AREA_ID_PROPERTY_NAME)); 
  labelFeatureLayer.Columns.Add(new FeatureSourceColumn(AREA_NAME_PROPERTY_NAME)); 
  labelFeatureLayer.DrawingQuality = DrawingQuality.HighQuality; 
  
  ValueStyle shapeValueStyle = new ValueStyle(); 
  shapeValueStyle.ColumnName = AREA_ID_PROPERTY_NAME; 
  shapeFeatureLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(shapeValueStyle); 
  shapeFeatureLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; 
  
  ValueStyle labelValueStyle = new ValueStyle(); 
  labelValueStyle.ColumnName = AREA_ID_PROPERTY_NAME; 
  labelFeatureLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(labelValueStyle); 
  labelFeatureLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; 
  //labelFeatureLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = TextStyles.CreateSimpleTextStyle(AREA_NAME_PROPERTY_NAME, “Verdana”, 10, ThinkGeo.MapSuite.Core.DrawingFontStyles.Bold, GeoColor.StandardColors.Gray, 10, 0); 
  //labelFeatureLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; 
  
  shapeFeatureLayer.FeatureSource.Close(); 
  labelFeatureLayer.FeatureSource.Close(); 
  
  LayerOverlay areaLayerOverlay = new LayerOverlay(AREA_LAYER_OVERLAY_NAME); 
  areaLayerOverlay.Layers.Add(SHAPE_FEATURE_LAYER_NAME, shapeFeatureLayer); 
  areaLayerOverlay.Layers.Add(LABEL_FEATURE_LAYER_NAME, labelFeatureLayer); 
  areaLayerOverlay.IsBaseOverlay = false; 
  
  map.CustomOverlays.Add(areaLayerOverlay); 
  } 
 Hope you can understand my question!!! 
  
 Thanhks.

Duong, 
  
 Your second overlay is a WMS overlay, right? WMS overlay returns a raster image which will be put on top of the base overlay. So if the returned image from WMS is not transparent it would definitely override the base. Could you check the image the WMS returns? also please check its format as JPG doesn’t support transparency. If everything looks fine on the server side, could you let us know your WMS server address so we can have a look why it overlaps? 
  
 Ben

Duong, 



Wms layer by default is base overlay, so when you add it on client side you may want to set wmsLayer.IsBaseLayer to false, otherwise it might be overlapped by the existed base layer.  



It's not recommended to add layer on client side anyway, as the layers you added will be removed after a postback. A recommended way would be adding all the layers on server side but control their visibility on client side.  



Ben 



Hi Ben, 
 I 've added layer from server and set it isBaseOverlay = false but it seem to overlap the existed base layer. 
 My code: 
 WmsOverlay wmsOverlay = new WmsOverlay(“NYC”, new Uri(“192.168.1.203:8781/geoserver/wms”)); 
             wmsOverlay.Parameters.Add(“LAYERS”, “BanDoNen”); 
             //wmsOverlay.IsVisible = true; 
             wmsOverlay.IsBaseOverlay = true; 
             wmsOverlay.IsVisibleInOverlaySwitcher = false; 
             map.CustomOverlays.Add(wmsOverlay); 
  
             WmsOverlay blockOverlay = new WmsOverlay(“Block”, new Uri(“192.168.1.203:8781/geoserver/elcomWS/wms”)); 
             blockOverlay.Parameters.Add(“LAYERS”, “elcomWS:Blocks”); 
             blockOverlay.IsBaseOverlay = false; 
             map.CustomOverlays.Add(blockOverlay);

Duong, 
  
 I’m a bit confused here, so from your code ”NYC” WMSOverlay  is the base overlay and it always displays on the bottom; ”Block” WMSOverlay and another layer overlay are not base overlays so the 2 are expected to be on top of the base overlay, which means ”Block” WMSOverlay is expected to overlap the existed ”NYC” WMSOverlay, you can switch the 2 if you instead want “NYC” to overlay the “Block”. 
  
 I guess your “Block” WMSOverlay has some gaps which you expected to be transparent so you can see the “NYC” overlay under it, is that the case? If yes you need to make sure the return image of the “Block” WMSOverlay has got the transparent part and the image format is correct. For example “JPG” doesn’t support transparent. If that’s not your  case, could you let me know more what you are expecting to have? 
  
 Ben 


Ben, 
 "I guess your “Block” WMSOverlay has some gaps which you expected to be transparent so you can see the “NYC” overlay under it" is my expectation. 
 Image format is jpg and png. 
  
 I wonder why using: 
 protected void AddAreaLayer(Map map) { 
 InMemoryFeatureLayer shapeFeatureLayer = new InMemoryFeatureLayer(); 
 shapeFeatureLayer.FeatureSource.Open(); 
 shapeFeatureLayer.Columns.Add(new FeatureSourceColumn(AREA_ID_PROPERTY_NAME)); 
 shapeFeatureLayer.Columns.Add(new FeatureSourceColumn(AREA_NAME_PROPERTY_NAME)); 
 shapeFeatureLayer.DrawingQuality = DrawingQuality.HighQuality; 
  
 InMemoryFeatureLayer labelFeatureLayer = new InMemoryFeatureLayer(); 
 labelFeatureLayer.FeatureSource.Open(); 
 labelFeatureLayer.Columns.Add(new FeatureSourceColumn(AREA_ID_PROPERTY_NAME)); 
 labelFeatureLayer.Columns.Add(new FeatureSourceColumn(AREA_NAME_PROPERTY_NAME)); 
 labelFeatureLayer.DrawingQuality = DrawingQuality.HighQuality; 
  
 ValueStyle shapeValueStyle = new ValueStyle(); 
 shapeValueStyle.ColumnName = AREA_ID_PROPERTY_NAME; 
 shapeFeatureLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(shapeValueStyle); 
 shapeFeatureLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; 
  
 ValueStyle labelValueStyle = new ValueStyle(); 
 labelValueStyle.ColumnName = AREA_ID_PROPERTY_NAME; 
 labelFeatureLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(labelValueStyle); 
 labelFeatureLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; 
 //labelFeatureLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = TextStyles.CreateSimpleTextStyle(AREA_NAME_PROPERTY_NAME, "Verdana", 10, ThinkGeo.MapSuite.Core.DrawingFontStyles.Bold, GeoColor.StandardColors.Gray, 10, 0); 
 //labelFeatureLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; 
  
 shapeFeatureLayer.FeatureSource.Close(); 
 labelFeatureLayer.FeatureSource.Close(); 
  
 LayerOverlay areaLayerOverlay = new LayerOverlay(AREA_LAYER_OVERLAY_NAME); 
 areaLayerOverlay.Layers.Add(SHAPE_FEATURE_LAYER_NAME, shapeFeatureLayer); 
 areaLayerOverlay.Layers.Add(LABEL_FEATURE_LAYER_NAME, labelFeatureLayer); 
 areaLayerOverlay.IsBaseOverlay = false; 
  
 map.CustomOverlays.Add(areaLayerOverlay); 
 }  
  
 is ok??? LayerOverlay output has correct format??? 


duong,


Shapefile is vector data and we will internally generate a png file for each LayerOverlay, so it supports transparent.  However WMSOverlay directly fetch a bitmap from the WMS server and the server might not support transparent. I suggested you check the WMS server first and if there is anyway we can access that server, we are glad to help.


Ben