ThinkGeo.com    |     Documentation    |     Premium Support

Best practice for using LayerOverlay and Layers?

 


Hi, 
 
I would like some advice to organize my map data.
With Map suite WPF, we can use Layers (MsSql2008FeatureLayer ; ShapeFileFeatureLayer ; InMemoryFeatureLayer ...) and LayerOverlay.
 
In our application, we have several layers : 
 - Layers with raster (I use MultiGeoRasterLayer)
 - Several Layers with geometry data : 
 
1) Some data are recorded in SQL Server 2008 express. 
 
Among these data, some are static (for example, we have polygons which represent  departements in France (equal states in United states) ), and the others are dynamic (for example, we have a layer with polygons which represent a plot of land and this one can be modified, cut etc .  Our customer modify these polygons).
 
2) Some data  are recorded in shapefile.
 
3) And I use layer InMemoryFeatureLayer when I want hightlight a polygon (=polygon selected).
After that, I use this layer when I edit the polygon selected.
 
At present, I organize my data so : 
1) I put layers Rasters (=MultiGeoRasterLayer)) + layers data (=MsSql2008FeatureLayer) on one LayerOverlay
2) I put layers InMemoryFeatureLayer on one LayerOverlay
3) I put layers ShapeFileFeatureLayer on one LayerOverlay
 
Which is the best way to organize the LayerOverlay, and best way means having a fast application ? 
Is there a max of layers there not to be overtaken on a LayerOverlay ?
 
What is the better solution ? : 
1) A lot of layers on one LayerOverlay and so we'll have a few LayerOverlay ? 
2) A few layers on one LayerOverlay and so we'll have a lot of LayerOverlay ?
3) It doesn't matter and the organization of data answers more a logic business ?
 
 
Thanks a lot.
 
Regards.
 
Stéphanie.
 
 
 
 


Hello Steph, 
  
 Thanks for your post. 
  
 “Is there a max of layers there not to be overtaken on a LayerOverlay ?” 
 No, there isn’t any limit. 
  
 1) A lot of layers on one LayerOverlay and so we’ll have a few LayerOverlay ?  
 2) A few layers on one LayerOverlay and so we’ll have a lot of LayerOverlay ? 
 3) It doesn’t matter and the organization of data answers more a logic business ? 
  
 Actually yes it doesn’t matter if you all use LayerOverlay, you can put all layers in one LayerOverlay or put them in separately LayerOverlay with special name in case you can find them easily. And below is some possibility will use different LayerOverlay. 
  
 1. You need refresh some layers very frequency, then put them in separate LayerOverlays. Then just call the Overlay refresh, it won’t cause all layers refersh make the performance problem. 
 2. You need get/edit some layers after the map rendered, then put them in separate LayerOverlays, so it’s easier to get them. 
 3. You want to hide some layers, put them in different overlay, then you can use overlay switcher or just hide the overlay. 
  
 It’s very flexible to use the LayerOverlay and it won’t have any performance problem. 
  
 Let us know your queries. 
  
 Regards, 
  
 Gary

HI Gary,  
  
 Thanks for your answer. 
 Juste before I sent my first post, I read this 
 gis.thinkgeo.com/Support/DiscussionForums/tabid/143/aff/39/aft/7898/afv/topic/Default.aspx#25890 
  
 And in this post, it is recommended not to have too many LayerOverlay. This is no more true ?  
  
 Thanks. 
  
 Regards. 
  
 Steph.

Gary, unless you have changed the underlying architecture, I believe you do not want to have too many overlays as they contribute to the WPF visual tree.  It is best to use a few, possible less than 5 overlays altogether, and instead have may layers per overlay.

I completely agree with Klaus, in fact during the initial tests I found It was a big difference in performance.



Hello Guys, 
  
 My apologize, actually I made that answer all depends on Steph’s scenario, so I didn’t realize it will have too many overlays. 
  
 That’s right to have less Overlays and put as many layers in one Overlay, and the three situation I listed above it some reason to let you use separately overlays, but not too many. 
  
 Sorry to make people confused and maybe misunderstanding. 
  
 Regards, 
  
 Gary

Hello,  
  
 Thanks a lot for your help. 
  
 Regards. 
  
 Steph.

Hello Steph, 
  
 You are welcome, please feel free to let us know your problems. 
  
 Regards, 
  
 Gary

Hi



I have another questions about layers and overlays.
In this post you said that the best configuration is to have some overlays and lots of layers on each of the overlays.
1) what is the maximum layers to put on an overlay and having good performance in our application ?



2) The refresh() method is on the overlay. 


So If I have 15 layers on an overlay, the refresh method will be applied to 15 layers, even if I made a change on a single layer. Does this have an impact on performance?



3) Organization of layers
In this post (thinkgeo.com/forums/MapSuite/tabid/143/aft/7898/Default.aspx#25890), Klaus said he had organized his overlays depending on the type of tile (singletile / multiple tile).
This is the best approach to have good performance?



Currently, I organized my overlays this way : 
overlayRaster with TileType equals to hybridtype. There are severals layers (overlay for basemap)
overlayStatic with TileType equals to singletype. THere are 4 layers and possible more (Mssqlfeaturelayer2008). The layers are in read only ie no need refresh method on these layers
overlayDynamic with TileType equals to singleType. There are between 4 layers to 10 or more (Mssqlfeaturelayer2008). The features on these layers can be modified so need refresh method
overlayMemory with TileType equals to singleType. There are 3 layers (InmemoryFaturelayer).The features on these layers can be modified so need refresh method.



Is my application would be more efficient if I made only 2 overlays (one with hybridtile and the other singletile). However, with this configuration I will refresh some layers that do not need it (because read-only) ?






4) I have water features (rivers, wells, ponds, etc …)
In db, I have a sql table with a discriminator column to differentiate these elements (Type = 2 for rivers, Type = 3 for wells, TYpe = 4 for ponds, etc …)
For better performance, what is the best configuration : 
a) A layer for each features water so 3 layers (layer river , layer well, etc …). So If i want to display only the rivers, the visibility of layerRiver is visible and the others are non visible, etc …
b) A single layer and to differentiate the elements, use either a filterstyle or Where clause (if mssqlFeatureLayer) … ?



Thanks a lot for your help.
Regards
Steph.

Hi Steph,



Please check some my guesses as following, maybe it’s not the reason of the issues you are encountering, but anyway, please have a check.



1.  Just based on the codes and API design, no limited, but actually it’s depended on your actual requirements, environment, and application. Technically, putting all the layers in an Overlay has the following advantages:

a. If you are using SingleTile, we just need to create only one WPF image element to hold the all layers, thus it decrease the number of the WPF elements, less memory consumed(maybe not very obvious),but better performance.

b. if they are static data, we can create a tile cache for all layers and save them to disk, thus everything should be really fast. 



but actually all these advantages are depended, we should do a comparison between drawing layers and WPF elements rendering. and some related stuffs as well, that’s the reason why I say it’s depended. 



2. Yes, I guess this should be a limitation if we put lots of layers into a single Overlay, I will enter this requirement into our internal enhancements tracking system to see if we can do any improvements or provide any related APIs here.



3. Technically, the SingleTile has a much better performance than Multiple-tile, but the later one provides a better user-experience than the previous. Usually, we suggest putting the layers which need updating dynamically, or for holding the geometries to an Overlay with SingleTile, but others which don’t need to update (Read-only, to some extent) in another overlay with Multi-tile.



4. I think the options you are taking seems like fine, in this case, I guess you can assign tilecache to these river layers.



Thanks,

Johnny





Hi, 
Thanks for this explanation, and indeed I would be interested to improvements on point 2. Thanks.




I have questions about tile cache to improve the performance of our application (more reactive application)
Lets’ say I have 3 overlays (one for the basemap, one for staticoverlay et one for dynamicoverlay).


On overlay basemap , I have 2 layers (equals to raster layer with ecw , jp2, tif, etc …). 
The parameters of tile cache on the overlay are : 
    ovLy.TileCache = new FileBitmapTileCache(OutilsOvLyr.PathCacheRaster, “ManualCache”);
            ovLy.TileHeight = 256;            
            ovLy.TileWidth = 256;
            ovLy.DrawingQuality = DrawingQuality.HighSpeed;
            ovLy.TileType = TileType.HybridTile;
            ovLy.TileBuffer = 2;



The user can change the visibility and transparency of the layers.
So how to manage the cache in this case ?
Should we make a clearcache at each change visibility or transparency of rasters ?  (Overlay.TileCache.ClearCache():wink:


Because the parameters of the tile are on the overlay and not on the layers ?



In our application, the cache generation is on the fly. Is there an another way to generate a cache ?





Thanks for your help.
Regards







Hi Steph,



There is a way to change the transparency for layeroverlay even we assign a cache on this overlay. We can change the Canvas opacity property of layeroverlay to change it, some codes like:


ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(@"…\SampleData\Data\Countries02.shp");
worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.SimpleColors.Red, GeoColor.FromArgb(100, GeoColor.SimpleColors.Green));
 
LayerOverlay staticOverlay = new LayerOverlay();
staticOverlay.OverlayCanvas.Opacity = 0.4;
staticOverlay.TileCache = new FileBitmapTileCache(@"C:\temp\worldlayer","cacheid");
staticOverlay.Layers.Add("WorldLayer", worldLayer);
staticOverlay.TileType = TileType.MultipleTile;
wpfMap1.Overlays.Add(staticOverlay);

As for generate cache, we have a tool which is used to cache the whole tiles within an expected extent. Please refer to thinkgeo.com/forums/MapSuite/tabid/143/aft/10446/Default.aspx

Please let us know if any questions.

Thanks,

Troy

Hi Troy, 



Thanks.
So if I use OVerlayCanvas.Opacity, this change the opacity of the overlay and I did not need to use clearCache().
But in the following cases : 
LayerOverlay staticOverlay = new LayerOverlay();
staticOverlay.TileCache = new FileBitmapTileCache(@"C:\temp\worldlayer","cacheid");
staticOverlay.Layers.Add("WorldLayer", Raster1);
staticOverlay.Layers.Add("WorldLayer", Raster2);
staticOverlay.TileType = TileType.MultipleTile;
wpfMap1.Overlays.Add(staticOverlay);



Step 1) Raster1 and Raster2 are visibles so  2 layers are recorded in the cache.
Step 2) If the raster1 becomes no visible, and raster2 is still visible so I have to clearcache() to see only the raster 2 ? Or there is another way to handle it ?



Thanks.

Regards.

Steph.

Hi Steph,



Your understanding is correct, once we enable the TileCache for a layeroverlay, then we should treat the layeroverlay as an unit. Currently, I didn’t find a good way to control the layers within this layeroverlay except clear the cache.



But I think if your layers are not too many, we can only add one layer for one layeroverlay and then it should be fit your case.

Please let us know if any questions.

Thanks,

Troy

Hi Troy,  
  
 OK. Thanks. 
 Regards.

Steph, 
  
 You are welcome! 
 If any other questions, don’t hesitate to let us know. 
 Thanks, 
 Troy