ThinkGeo.com    |     Documentation    |     Premium Support

Displaying Many (~10k) Points on a Map

Hi,


I would like to plot about 10,000 points (lat/long) from a database on a WinformsMap.  Additionally, once all 10k points are shown on the map, I would like to select a point on the map and show additional information retrieved from a database.  I plan to use the cluster point style example to help display all of the points neatly at high out zoom levels.


Currently, I am taking each point from the database and creating a new PointShape object.  Then the PointShape object is wrapped into a Feature object, then it's added to the InternalFeatures of a InMemoryFeatureLayer object.  No column data yet.  I am getting to somewhere near 8k points before an OutOfMemoryException is thrown (task manager at the time showed the program using a bit over 1gb).


After trying this, I noticed the MsSql2008FeatureLayer and will try this next and see how the memory efficiency is with that.


I figured I'd ask before implementing this time.  Do you see anything wrong with this new SQL 2008 approach?  Is there something I did wrong with the first approach and therefore I should see less memory usage if done correctly?  Is there an alternative that I do not see?  


Your help is much appreciated,


Derek


PS - A kind question/suggestion: I noticed the InternalFeatures is a GeoCollection which inherits from List<T>.  My understanding is that List<T> requires contiguous memory allocations.  When an OutOfMemoryException was thrown, I was still able to other applications without a problem while my application occupied the 1gb of memory.  My understanding for this was that there was still memory available, but because it was not contiguous, I could not add more features to the map.  Ideally, a program would be designed to use as little memory as possible, but still has ThinkGeo considered inheriting from a LinkedList<T> instead?



Derek,


Thanks for your post, I checked your problem on my local machine and I cannot reproduce it, the query process for GetAllFeatures ability works fine for more than 10k records on my machine and the speed is very fast. Here is my test code below:


 



 string connectString = "Data Source=MyServer\\SQL2008;Initial Catalog=InternalDB;Trusted_Connection=True;";
            MsSql2008FeatureLayer sql2008Layer = new MsSql2008FeatureLayer(connectString, "cities_e", "id");
            sql2008Layer.Open();
            Collection<Feature> result = sql2008Layer.FeatureSource.GetAllFeatures(ReturningColumnsType.NoColumns);
Also the attachment is the test data from the WorldMapKit dataset, it has about 20k records, we imported all of the records to the SQL Server 2008 first and then use the code above to test,


If you still have problem please send your shape file to us so that we can check this problem exactly.


Thanks,


Scott,



USA.zip (476 KB)

Thanks for the sharing about the List and LinkedList, I’ve reported it and we will have more investigation to make sure it is correct as you said, and of course will follow the most correct way.  Thanks very much for this!

Derek, 
  
 Thanks for this again. You are right that Link<> is using sequential memory which is more possible to have an OutOfMemory Issue compared with LinkedList, but maybe for the case of InternalFeatures, List<> is a better choice, as having the structures packed in sequential memory is fast, and with List<> we can random access one record. Looping through the features in an lFeatures Collection is a common scenario we want to make it really fast. Also although you can do it, adding 10k records all to memory is not recommended, maybe you can choose to load data on the fly only the time you need it. 
   
 We are open to any great ideas and users’ suggestions/comments can always help us to make the products better.  We really appreciate your sharing! 
  
 Thanks, 
  
 Ben 


I have a follow up question here ;) 
  
 Adding the features are really fast, but howto present them on the map without it taking ages to render and zoom ? 
  
 Also without loosing the ability to click the dots and show additional information 
  


Martin, 
  
 Thanks for your post and question. 
  
 I think the ability to click the dots and show additional information depends on the spatial query ability, it is not closely related with the render and draw. 
  
 The Zoomin/Zoomout functionality is just trying to adjust the current extent to a close look or far away from existing view, so this would be very fast for the calculation, while when zoom out far away and a lot of features are expected to be shown, then it would be very slow which mostly caused by drawing speed. 
  
 The majority job of the render and draw is utilizing the GDI+ APIs to draw, so for now we can do litter if too much features are involved to get it boosted, we will do some research on other kinds of drawing APIs like GDI instead of GDI+. 
  
 Any more questions please feel free to let me know. 
  
 Thanks. 
  
 Yale