ThinkGeo.com    |     Documentation    |     Premium Support

Which type of markers to use?

Hello.  I'm trying to create a "fleet status" application that pinpoints the current location of a fleet of aircraft on the map.  I have the following requirements:  



        
  • A typical "fleet" will have less than 10 aircraft, although some may be larger, but I don't anticipate it ever being more than 100. I am using a custom Fleet object that is a collection of Aircraft objects as my data source.

  •     
  • Each aircraft needs a popup to identify it, and present other custom information.

  •     
  • We need to be able to turn individual aircraft on or off -- i.e. either show them or not, but on an individual basis.

  •     
  • We need to plot flight routes, and be able to turn them on or off individually as well.  Each flight route is a multi-segmented line consisting of several waypoints.


I was able to use the example code provided in this post: gis.thinkgeo.com/Support/DiscussionForums/tabid/143/aff/12/aft/5040/afv/topic/Default.aspx to sort of accomplish this, but I have a feeling this is not the best way.  I've read about the InMemoryMarkerOverlay, but the code in the example I referenced just uses the regular MarkerOverlay of the Map object.  Also, I can't figure out how to display or hide markers (I would like to load all of them initially, and then just set a "Visible" property, if there was one).  


Bottom line is that I'm very confused about the best approach to achieve the requirements I described above. There seem to be many ways to attach markers to the map, and I'm not sure which is the best.  Please advise.


Thanks,


Ken


 











Hi Ken,


 


That’s a good question; we have InMemoryMarkerOverlay, FeatureSourceMarkerOverlay, and SimpleMarkerOverlay in Map Suite Web Edition.


 


FeatureSourceMarkerOverlay is similar like FeatureLayer, it reads data from a concrete FeatureSource such as ShapeFileFeatureSource, InMemoryFeatureSource, MsSql2008FeatureSource etc, so FeatureSourceMarkerOverlay supports projection, querying features, editing features and zoom level styles etc; when the FeatureSource is specified, we generate the Markers from these FeatureSource dynamically, so FeatureSourceMarkerOverlay is used for bunch of Markers which loading from a concrete FeatureSource.


 


InMemoryMarkerOverlay is similar like FeatureSourceMarkerOverlay; the most difference is that, FeatureSourceMarkerOverlay supports various kind of FeatureSource, while InMemoryMarkerOverlay supports InMemoryFeatureSource only. It is a shortcut for FeatureSourceMarkerOverlay and it also can do the projection, querying, editing and zoom level style etc.


 


SimpleMarkerOverlay is an overlay which manages markers directly, for example, you can create a marker object and add into the overlay. It displays all the markers directly which are existed in the overlay, it doesn’t support querying, projection and zoom level functions. By the way, SimpleMarkerOverlay supports dragging.


 


There is some performance difference between them, once Markers are added into SimpleMarkerOverlay; it’ll always be in the DOM tree no matter it’s inside or outside the viewport, while FeatureSourceMarkerOverlay and InMemoryMarkerOverlay only add markers inside the viewport dynamically. You know if there are thousands of nodes in the DOM tree, the IE may crash, so the first two types of overlay I mentioned may have better performance if the count of markers is big.


 


As your case, I recommend to user SimpleMarkerOverlay, so the markers can freely managed by you.


 


The attached sample indicates how to switch the markers’ and layer’s visibility. 


We’ll have IsVisible property in marker class in the upcoming version, that’ll be very easy to satisfy your scenario.


 


If you have any queries please let me know.


 


Thanks,


 


Howard




665-Post5710.zip (97.3 KB)

Thank you!  Excellent sample!  I got it working as you recommended.  I still have a few questions, however. 
  
 First of all, how do I name the lineshapes that I am adding as features to routeLayer?  I need to be able to add a route for each aircraft, and turn it on or off along with the aircraft. 
  
 Secondly, I have my map and all external controls wrapped in an update panel just as in your demo.  However, when I click the checkboxes (autopostback = true), although the code is executing on the server, the map does not redraw itself.  I found I had to add to call the Redraw() method of the base overlay to get the map to update, but when I do that, it redraws it on the screen every time.  How do I avoid this? 
  
 Thanks, 
 Ken

Hi Ken,



For naming the LineShapes, how about use aircraft marker Id as prefix of the LineShape Id?  So the LineShape Id should be: 
string routeLayerId = marker.Id + “_RouteLayer”;
Please replace the attached file with the one in the old solution I attached.



In the UpdatePanel, the DOM tree will be cached, so if the DOM tree Node such as IMG with the same request URI won’t be changed however the Response Stream is changed. So you need to call the redraw function manually.



My recommend is just calling this function when you changed the BaseOverlay’s rendering; hope there is no misunderstanding.



Any questions please let me know.



Thanks,



Howard



666-Default.aspx.cs (5.98 KB)

OK.  I got the lineshapes fixed as per your example.  I was trying to set a key value on the line shape itself rather than on the InternalFeature of the layer, which obviously wasn’t working. 
  
 I’m still not clear as to why I am needing to call the Redraw() method of the overlays to get my map to update, whereas your example doesn’t need to do that.  I’m not sure what I’m doing differently. 
  
 Thanks, 
 Ken

Hi Ken, 
  
 InternalFeatures is a collection which maintains a Dictionary, the key is to easily index the feature you added and has nothing to do with its own shape’s key value. 
  
 I didn’t call the redraw method because my BaseOverlay doesn’t change its rendering. So here is what I need to confirm with you, 
  
 1. Did you add an UpdatePanel? 
 2. Why do you need to call Redraw method? Did you add the route layer into BaseOverlay, or the BaseOverlay changed its rendering? 
 3. What do you mean by redraw the map every time? Does “every time” means when you click the checkbox or panning or other operations? 
  
 Could you please provide me more information or a small sample; it must be much more helpful. 
  
 Any questions please let me know, 
  
 Thanks, 
  
 Howard 


Your questions helped me figure it out.  I had other features in the base layer, so when I was turning them on or off (in response to the user clicking various option checkboxes), it required that I redraw the base layer, which was causing the whole map to flicker.  I moved those features into another overlay above the base overlay, and now it's all good.


Thanks for all your help!


Ken



Hi Ken, 
  
 You are so welcome; if you have more queries, please let me know. 
  
 Thanks, 
  
 Howard