ThinkGeo.com    |     Documentation    |     Premium Support

InMemoryMarkerOverlay and SimpleMarkerOverlay

 Hi,


In our project we will have multiple layers and I just need clarification that I'm selecting the correct layer type for each project


 


Layer 1


Static base layer


 


Layers 2 and 3


Mostly static items [should change position slightly and probably only once a day]


These items need popups, dragging capability and context menus.


Although I have concerns with performance I will use a SimpleMarkerOverLay due to the requirements above


 


Layer 4 GPS tracking


Dynamic Layer


Tracks 1 or more vehicle GPS location


Popups, dragging capability and context menus required


It would seem that for performance that an ImMemoryMarkerOverlay would be the best options however without the support [as I understand it] for Popups, dragging capability and context menus it would seem that we have to go with the SimpleMarkerOverlay again.


 


Layer 6 Vehicle Breadcrumb trail


Probably will be a InMemoryMarkerOverlay for performance reasons and also due to the fact that Popup info is required only without the need to drag or have context menus


 


Layer 7


Historical locations of items in Layers 2 and 3


Could be a lot of data


Once plotted it wont change


Probably will be a InMemoryMarkerOverlay for performance reasons and also due to the fact that Popup info is required only without the need to drag or have context menus


 


Queries


I have selected the SimpleMarkerOverlay due to the requirements for a context menu and drag and drop mainly. If this was available in the InMemoryMarkerOverlay then that would be a better choice.. Is therer a way to do this easily


As I understand it, with an InMemoryMarkerOverlay its easy to query the layers and also locate the features inside a polygon created on screen. Is it possible/easy to locate the Markers on a SimpleLayerOverlay that is contained within a polygon and also to use functionality such as Keepout regions.


Can you explain the differenec between a FeatureSourceMarkerOverlay and a InMemoryMarkerOverlay and where you would choose one over the other


Thanks and Rgds,


Liam


 


 


 


 



 Hi Liam,


Please see the answers as following.


MarkerOverlays
One thing which I need to make clear is that the InMemoryMarkerOverlay and FeatureSourceMarkerOverlay do support the popups and ContextMenus except dragging capacity owned by SimpleMarkerOverlay only. Please refer to the installation samples in the folder “[Installation Folder]\ThinkGeo\Map Suite Web Full Edition 4.0\Samples\CSharp Samples\Samples\Markers”. But we don’t recommend you using MarkerOverly with lots of data. Whichever it is, because all the markers are created on the client side, if the Brower needs to create a huge DOM tree, it will give the script error. I think you can try using the InMemoryFeatureLayer to render Layer6 and Layer 7, because it seems that they don’t change a lot, right?
Just as you have found, the InMemoryMarkerOverlay and FeatureSourceMarkerOverlay works with a better performance than SimpleMarkerOverlay, because the SimpleMarkerOverlay always loads all the markers within full extent but the other two MarkerOverlays just loads the markers in current extent by request automatically via AJAX.
 
Queries
The markers are used to represent the places, in other words, each marker has the position property with PointShape type. So we can query the markers via Polygon/PointShape.
 
Suggestion 
From your description, I think your requirement is very similar to one of our source kit products “Vehicle Tracking”, maybe you are interested in it gis.thinkgeo.com/Products/Ex...fault.aspx .
There are two links to the demos of the Start Kit. The difference is that we have two projects, one that does most of features on AJAX on the client side and another that is server side centric. That’s a good way to start off your project and it can guide you the right way quickly.
Client side: vehicletracking.thinkgeo.com/ajax/ 
Server side: vehicletracking.thinkgeo.com/server/ 
Thanks,
Johnny

Hi Johnny, 



Thanks for the comprehensive reply, the advice and the links. 



I guess that I could simulate a drag in a layer from an InMemoryMarkerOverlay by designing the UI in a way such that the user needs to click a button to start the dragging process. [We don't want a user dragging items by mistake anyway] 



On the button click event we could then display a temp SimpleMarkerOverlay Marker in the same location as the feature that the user wants to drag. I could then update the feature location in code myself using the end location of the SimpleMarker Overlay Marker. 



This would get around the dragging requirement without compromising performance which is a big concern to us as there could be thousands of items in the map. 



Would this be in your opinion a viable workaround? 



Also can you explain the differences between a InMemoryMarkerOverlay and a FeatureSourceMarkerOverlay and where you would use one over the other?


The samples show how to add a Context menu to a feature in an InMemoryMarkerOverlay but is there an easy way to get the feature that the context menu belongs to. If I right click on a feature I need to know what feature was clicked on.


ContextMenuItemClickEventArgs gives location only and I suppose in the absence of another method I could use this to locate the feature clicked [right clicked] possibly using the query tools as follows.





 


 


        private void contextMenuRCItemSample_Click(object sender, ContextMenuItemClickEventArgs e)


        {


 


            InMemoryMarkerOverlay markerOverlay = (InMemoryMarkerOverlay)Map1.CustomOverlays["Vehicles"];


            Collection<string> columnNames = new Collection<string>();


            columnNames.Add("ID");


            markerOverlay.FeatureSource.Open();


            Collection<Feature> features = markerOverlay.FeatureSource.GetFeaturesNearestTo(new PointShape(e.Location.X, e.Location.Y), GeographyUnit.Meter, .1, columnNames, 1, DistanceUnit.Meter);


            markerOverlay.FeatureSource.Close();


 



//etc




Rgds, 

Liam



Hi, Liam 
  
 Sorry to reply your post so late. Thanks for you update on this post. 
   
 First off I want to clarify the difference between the FeatureSourceMarkerOverlay and InMemoryMarkerOverlay. As for InMemoryMarkerOverlay, and it was a MarkerOverlay object that dynamically creates markers from the InMemoryFeatureSource, but as for FeatureSourceMarkerOverlay, and it generates markers from the features retrieved from its FeatureSource. Thus, you need to set the FeatureSource property before the marker overlay can create the markers. So that you can see that InMemoryMarkerOverlay is also a FeatureSourceMarkerOverlay and its FeatureSource was specified as InMemoryFeatureSource. 
  
 If you wan to get more detail information about the difference between these two MarkerOverlay, and I suggest that you could refer to the SetTheZoomLevelsOnAMarker sample in our installed samples and you can find its source at “Samples\Markers\SetTheZoomLevelsOnAMarker.aspx”. 
  
 For your another question about the ContextMenu, and as what you have mentioned in the last post, we just provide the position only for your clicked feature. But you can get the feature clicked through Spatial Query of FeatureLayer. 
 In fact, there are three places to use the ConextMenu functionality, and they are Map object, HighlightFeatureOverlay and MarkerOverlay separately. So in order to handle the general scenario and we don’t support that.  
  
 Anyway, thanks for your suggestions about ContextMenu. And we will consider that. 
  
 If you still have any questions about it please let us know. 
  
 Thanks, 
  
 Khalil 


Hi Khalil, 
  
 Thanks for that. 
  
 Rgds, 
 Liam

Liam, 
  
 Thanks for your feedback. You’re welcome. 
  
 Thanks, 
  
 Khalil