ThinkGeo.com    |     Documentation    |     Premium Support

FileBitmapTileCache. Some problem

Hello, I would like to immediately apologize for my English.


 I am having the following problem.

I use FileBitmapTileCache and it works, but..

However, when I add new features to the map, there is no refreshing. A redrawing occurs after a change of scale. I called the main function such as mainLayer.Refresh(), but it isn't work. All features added to map when scale is changing(( 


Samples:


private void Window_Loaded(object sender, RoutedEventArgs e)

        {


       WorldMapKitWmsWpfOverlay worldMapKitOverlay = new WorldMapKitWmsWpfOverlay();

       wpfMap1.Overlays.Add(worldMapKitOverlay);



       this.mainOverlay = new LayerOverlay();


       bitmapTileCache = new FileBitmapTileCache();

       bitmapTileCache.CacheDirectory = @"..\..\SampleCache;

       bitmapTileCache.CacheId = "CacheTiles";

       bitmapTileCache.TileAccessMode = TileAccessMode.ReadAddDelete;

       bitmapTileCache.ImageFormat = TileImageFormat.Png;

       this.mainOverlay.TileCache = bitmapTileCache;


                wpfMap1.Overlays.Add("InmemoryOverlay", this.mainOverlay);

                wpfMap1.Refresh();


}


 private void LoadNewDataAndRefresh()

        {


            #region House Data Load

            if (this.mainOverlay.Layers.Contains(ResourceLayerName.HouseLayer))

            {

                InMemoryFeatureLayer houseLayer = this.mainOverlay.Layers[ResourceLayerName.HouseLayer] as InMemoryFeatureLayer;



                //Here I get a layer that was previously added to the main layer and add some new features from BD to this layer.



                wpfMap1.Refresh();

            }

            #endregion


}


This sample is using cache, but refreshing the map (maybe use cache files), but files are updated after that scale changed(((


 


If the issue was not clear, you can send me an email a working apllication of Wpf Desktop Edition using FileBitmapTileCache.


 


Thank you very much



Alex, 
  
 Thanks for you post, I think I understand what is going on but please feel free to ask more questions if my solution doesn’t make sense.   
  
 Typically caching is used for fairly static data that doesn’t change often, in cases where the data is dynamic I would suggest rendering it on the fly and not use caching.  However in your case above if you want to use caching you will need to clear the tile cache once the new features are added to your layer and overlay.  You can do this by calling the ClearCache method on your bitmMapTileCache object. 
  
 Hope this helps. 
  
 Thanks! 
  


Thank you, I tried to clear the cache, the same result.

 I have approximately 100,000 objects. Drawing (redraving) is very slow.:( Can you let me have any advice? I thought the cache would help. (The displacement map is redrawing very slowly (PC: i7 3.4 Ghz, 8gb ram). Is it possible to somehow include multithreading to redrawing?


Thanks



 Do you have the TIleType set to MultipleTile for the overlay carying your InMemoryFeatureLayer?  This would result to asynchronous map redraw. 



Alex & Klaus thanks for your replies! 
  
 If you have a 100,000 objects managing the zoom levels for which they are displayed is the first step, if you try to show a 100,000 objects all at once it’s just going to be a big blob anyways and unmeaning full at the higher zoom levels.  I wouldn’t turn these features on until I was zoomed in far enough that you could see some separation between them at a minimum. 
  
 I would take a look at the “Refresh Points Randomly” sample under the “Dynamic Shapes” section of the How Do I Samples for the WPF Edtion.  This will show you how to refresh and update a large number of points in a quick manner. 
  
 I hope this helps. 
  
 Thanks!

2Clint:


Thank you!

I watched this example, but there you have 2000 points. And what if the objects 100 000? I tried to do in your example, 100 000 and the program just hangs, loading them. Explain a specific example. I have 100 thousand polygons (eg, buildings) in spherical coordinates. I upload them from the database and want to display on your background map. How can I speed up the rendering of objects? Let's say we move on ZoomLevel = 15, which gets 15% of all facilities. How can I quickly make a move on the map and other objects and how to use caching? I want to go back to the place where we were, the objects are not re-painted, and loaded from the cache. Suppose that, at all levels of scale are given all the same 100 thousand objects. That is, nothing changes at different levels of scale. 



Advise please how to achieve the fastest possible rendering of objects? which strategy to choose? Perhaps you have an example. 



And I would be very grateful if you told about your application multi-threading for wpf. Is it possible to render the use of all cores?



2Klaus: 
  
 Yes, I do.

 Alex, first of all, what knd of database are you using - Shapefiles, PosgreSQL or a non-spatial database? 


Secondly, are you loading all 100,000 objects into memory at once or are you querying for these features based on the map's current extent and loading them as desired?   I think this is the point that Clint is making in his response.  If you are going to be dealing with so many features, you have to first of all use a back end that supports spatial indexing and querying based on geometry.  No shortcuts here as MapSuite will then search for these features and create the tiles asynchronously but it does so by querying for the features based on the current map's extent.  


If you are using an InMemoryFeatureLayer, I suspect you are loading all of these features into memory at once.  If you insist on doing this, and dependng on how you are loading the features, you can also call BuildIndex on the FeatureLayer to speed things up.


FWIW, I am using the World Map Kit as base map that renders 25G worth of map data, but this has been optimized based on zoom level.  So I am sure with the right approach you can display 100000 objects.


Also, I do not think that the sample that refreshes points randomly is designed with performance in mind.  There are some things that need to be done to that sample to get it to work with 100000 objects correctly.


 



Thank you, Klaus, for your reply. 
  
 I use Sql 2008, but I don’t want to use MsSql2008FeatureLayer, because it needs a constant stable connection to the server and generates a lot of queries that can be avoided (i use Sql Profiler). I load only the data that come to its location on the user’s screen. If the zoom level is high, the load is not a lot of data (eg, 2000) and then painting is a more or less at normal speed. But as a rule the work is done on a smaller scale, so you need to download, for example, 50 or 100 thousand objects (polygons in spherical coordinates). And that’s when the problems begin with the rendering. Of course, I load all the objects first in memory (it happens fairly quickly, no more than a second), but here’s map update is very slow.

I use a spatial index in the database, which allows me to use the standard operations and search for data more quickly. But this does not help indekst speed up rendering of the map (which is logical). 



I tried to use BuildIndex(). 

No changes were detected.



up!)

At the moment there is only one problem in the library: it is drawing large amounts of data. For example, I needed to draw 1.5 million polygons (zoom set to maximum level that is visible to a very large area). there is a problem. Upload data from the database takes about 15-20 seconds. But the rendering is very much slower. Moreover with increasing zoom map starts very slowly redrawn. 
  
 You can throw an example using the order of 1 million objects and fast redrawing? I am using WPF application. Perhaps, the correct use of the cache (Unfortunately now it does not work well when I change the scale . Now this is really a problem). 
  
 I would be very grateful. Thank you.

Alex, that is indeed a lot of data to load into memory at any given time regardless of the technology, especially when we are talking about managed code here.  Also, I do not see how you could possibly have 1 million polygons rendered on the screen and still be able to deduce any meaningful information from it all.  Also consider what is involved in creating the image.  For each feature, the GIS engine has to use the style defined to create some sort of object, which at the end of the day is combined into one large image.  1 million polygons is just simply a lot of data. 
  
 Having said this. you will have a problem regardless of what GIS engine you use.  As has been stated earlier, step back and look at this from another angle.  First assume that drawing 1 million polygons is not practical from a resource standpoint and think how you can narrow down the resource set to say a few thousand.   
  
 I will instead take this approach rather than trying to draw 1 million polygons, as you will not get the kind of performance you desire.

Here is an example of a simple task. The customer wants to see the city a small scale. The city has about 1 million objects (the layer houses, roads, intersections, rivers, administrative zones, residential zones, fences, etc.). The customer knows the city well and can estimate how far away places missed his managers at work. For example, such a task. 
  
 Okay, let’s say one million objects at once, we will not ship. Assume the screen is placed 10 - 50 000 objects. A more realistic? I want to understand how to work with BitmapTileCache. Simply, it works well within one level of zoom. As soon as I try to switch to a different scale, it fails, then loaded the wrong picture, it remains empty space. I use the default cache (that is not working by hand with TileMatrix). I agree to the long loading times in one, but I want that later, when returning to the places where we were, the image was rendered very quickly. How to do it correctly? Given the smoothly varying levels of scale. Thanks in advance.

Hello Alex, 
  
 Sorry for delay, because this problems is weird, we have tested it, use some world map kit data, and we can’t recreate the problem. 
  
 Did you use the marker not the pointshape? Marker will use the image, if so, that will effect the speed a lot. 
  
 And now, we have changed the way of draw, we use D2D instead of GDI+ in WPF Edition, you can get the newest version and have a try, see if the performance problem can be fixed. 
  
 Regards, 
  
 Gary

It appeared in the version 5.5 of WPF Desktop Edition? 
 What should I do to this notice?

Hello Alex, 
  
 You can visit helpdesk.thinkgeo.com/ then choose the Evaluation Daily Builds to get the newest one. 
  
 Regards, 
  
 Gary

Thank you, Gary. 

I downloaded the latest version of your library (WpfDesktopEditionEvaluation 5.5.7.0), but unfortunately it does work in VS 2010 (.net framework 4.0).  



I have error: 



"A call to PInvoke function 'WpfDesktopEdition!InitializeDelegate::Invoke' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature." 



I have an idea why this happens. Chances are you connected unmanaged libraries in C++, but the balance stack in 4.0 framework has not been tested. If you try to work with the library at 4 framework in 2010 the studio, it will not work. You need to add an attribute at the assembly CallingConvention = CallingConvention.Cdecl. 

For example: 

[DllImport("imageinfo.dll", CallingConvention=CallingConvention.Cdecl)]. 



If I'm wrong or doing something wrong, let me know. And tell me how to solve this problem. I want to look at RenderMode.WindowsImagingComponent at the last version of library. 



Thanks. 



Hi Alex,


Sorry that Gary may not know this feature is not ready and the API is not fixed yet; you know it’s in the development version and it will be change any time. We are trying our best to make it work as soon as possible in all our products; but now, it’s not ready to use for you. 



Yes, the d2d does speed up the performance for some reason, but I think it doesn’t fix the problem you descript. Let’s say you have mentioned two issues.


1, the latest attached exception, it might caused by the reflection of the new rendering method. We will download the build to see if we can recreate this issue. Would you mind to let us know your test environment? Such as OS, X86 or X64 etc?


2, the performance to drawing 1 million features is not that slow as we tested, if you are using InMemoryFeatureLayer, would you might test my sample below? I randomly create 1,000,000 points and precached from zoom level 01 to 05, it takes a little time, after the behavior, it runs fast and it draws still fast without cache in the smaller scales. When the cache is turned on, we will looking for a cached file with the specified cache folder and cache id, if the cache file does not exist, we still need draw the layer one time. After that, if you visit the same area with the same scale, we will reuse the cached file. Once the layer is updated such as changing a style or adding a new feature, the cached files will be dirty, so you need refresh the cache manually, for example calling some method to clear the cache or change another cache id just in case you want to reuse your old cache again (if you want to reuse the old cache, just set the cache id back to the original one).


I agree with the explanation from Klaus and thanks to his answers. Just give more information and an example, let’s say, we have a tile with 256*256, let’s calculate this tile can only contain 65536 points. So in this way, if we draw 65536 points, this tile will look like filling with a solid color brush, it doesn’t mean anything in map. So we recommend breaking your data to several files and setting different style with different zoom levels, it will be the best approach to improve your app performance. Just like our world map kit product, if we render everything in every zoom level, it will be too slow to render it.


Hope the introduction and the sample blow can guild you a solution to improve your sample. If there is any misunderstanding, please let us know.

Thanks,

Howard



Post9696.zip (10 KB)

Thank you, Howard, for your post and example! It is really help to me! 
 Your application has forced me to look a little different for the organization of the rendering. 
 Now I’m trying to apply it to their data and settings. So most likely I’ll have a little bother.:)  
  
 Thanks!