ThinkGeo.com    |     Documentation    |     Premium Support

Cache is deleted when my application starts

Hello,


To improve the performance of my application, I decided to use the cache feature provided by MapSuite Desktop Edition.


I use the TileCache and the TileCachePreview, the render is ok and the performance is better when the cache is built. As I understood,  the cache is incrementally built and when browsing the map (pan, zoom).


My questions are : 


1. why the directory used to store the cache is deleted when I launch my application ?


2. What can I do to avoid this ?


Thanks for your answer


 



Stephane, 
  
 I am afraid your code is probably not correct, could you provide a sample to show the issue? Since I got the sample, I could easy to debug and find the problem. 
  
 Thanks, 
 James 


James, 
  
 this is the code used in my application, a method is defined to set the cache. 
 MyPlan.Name return the name of the map (string) 
 MyPlan.Id return a unique id if our system (int) 
  
         public void ApplyCacheOverlay(LayerOverlay layer) 
         { 
                 string cacheId = MyPlan.Name; 
                 FileBitmapTileCache fileBitmapTileCache = new FileBitmapTileCache(System.IO.Path.GetTempPath() + "WMS" + MyPlan.ID, cacheId); 
                 fileBitmapTileCache.TileAccessMode = TileAccessMode.ReadAdd; 
                 fileBitmapTileCache.ImageFormat = TileImageFormat.Png; 
                 layer.TileCache = fileBitmapTileCache; 
  
  
                 FileBitmapTileCache previewFileBitmapTileCache = new FileBitmapTileCache(System.IO.Path.GetTempPath() + "WMS" + MyPlan.ID, cacheId); 
                 fileBitmapTileCache.TileAccessMode = TileAccessMode.ReadAdd; 
                 previewFileBitmapTileCache.ImageFormat = TileImageFormat.Png; 
                 layer.PreviewTileCache = previewFileBitmapTileCache; 
  
                 layer.IsBase = true; //set for the pan preview mode works 
         } 
  
  
 2nd point : could you explain me how the scale is computed because it is used in the directory name ? 


 Stephane,


 


I have modified our HowDoI sample to apply your method, it works for me, the cache images didn’t be deleted when I laugh application next time, you can see my sample code below.


private void DisplayMap_Load(object sender, EventArgs e)
        {
            winformsMap1.MapUnit = GeographyUnit.DecimalDegree;
            winformsMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);

            ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(@"..\..\SampleData\Data\Countries02.shp");
            worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;
            worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

            LayerOverlay staticOverlay = new LayerOverlay();
            staticOverlay.Layers.Add("WorldLayer", worldLayer);
            winformsMap1.Overlays.Add(staticOverlay);

            ApplyCacheOverlay(staticOverlay);

            winformsMap1.CurrentExtent = new RectangleShape(-143.4, 109.3, 116.7, -76.3);

            winformsMap1.Refresh();
        }

 And the code for calculate scale is below which is ExtentHelper.GetScale method:


 public static double GetScale(RectangleShape worldExtent, float screenWidth, GeographyUnit worldExtentUnit, float dpi)
        {
            double scale = 0;
            if (worldExtentUnit == GeographyUnit.DecimalDegree)
            {
                scale = worldExtent.Width * inchPerDecimalDegree * dpi / screenWidth;
            }
            else
            {
                DistanceUnit distanceUnit = Conversion.ConvertGeographyUnitToDistanceUnit(worldExtentUnit);
                double distance = Conversion.ConvertMeasureUnits(worldExtent.Width, distanceUnit, DistanceUnit.Meter);
                double screenWidthInMeter = screenWidth * inchToMeter / dpi;
                scale = distance / screenWidthInMeter;
            }

            return scale;
        }

Thanks,


James



Hello 
  
 After comparing your sample with our code, I noticed that if we insert the code below after creating the LayerOverlay, the cache is deleted : 
 
            LayerOverlay layerOverlay = new LayerOverlay();

//This part make cache error
            layerOverlay.Lock.EnterWriteLock();
            layerOverlay.Layers.Clear();
            layerOverlay.Lock.ExitWriteLock();
 
 
  
 I don’t know why in our application, we have this lines of code. 
  
 Do you have an explanation for this ? 
  
  
 And for the second point, I will try to correct our code, because we made an special application to build the cache, and the width are not exactly the same than in our client application.

Stephane, 
  
 When user want to update overlay in multi-threading mode, he need to call EnterWriteLock/ExitWriteLock to keep thread safe, and since the overlay is already updated, so the tile cache is useless, it need to clear. Our internally logic is that when user call ExitWriteLock method, the tile cache will be clear at the next map.refresh() 
  
 So I suggest you remove those code to solve this problem. 
  
 Thanks, 
 James