ThinkGeo.com    |     Documentation    |     Premium Support

MarkerOverlay Collection

Greetings,


I'm transitioning all my FeatureLayers over to MarkerOverlays.  I would still like to have each of my MarkerOverlays grouped together similar to a LayerOverlay.  To do this, I made an overlay containing a collection of Overlays.  I overrode DrawCore to iterate through all the overlays and call draw on those, however when I do this, I get a NullReferenceException on the Draw of my MarkerOverlay.  I moved the MarkerOverlay out of the overlay collection in directly into the collection of overlays on the map and it worked fine.  For reference, I'm using a FeatureSourceMarkerOverlay.


Any ideas/help on how I can group MarkerOverlays similar to LayerOverlay for layers would be appreciated.


Thanks,


.Ryan.



Hi Ryan, 
  
 LayerOverlay is actually made from tiles while MarkerOverlay is formed with markers. But they have the same container: Canvas. I think it’s possible to do it. 
  
 Could you show us you code so that we can figure out the exactly reason causes your issue. 
  
 Thanks, 
 Howard

Hi Howard, 



I am doing something similar to the following.  It blows up when trying to draw the first FeatureSourceMarkerOverlay with a NullReferenceException. 



 public class MyOverlay : Overlay


{


private FeatureSourceMarkerOverlay mo;


private FeatureSourceMarkerOverlay mo2;


 


public MyOverlay()             : base()


{


mo = new FeatureSourceMarkerOverlay();


mo2 = new FeatureSourceMarkerOverlay();


}


 


 public Projection Projection


{


 set


{


 mo.FeatureSource.Projection = value;


mo2.FeatureSource.Projection = value;


}


}


 


protected override void DrawCore(RectangleShape targetExtent, RefreshType refreshType)


{


mo.Draw(targetExtent, refreshType);


 mo2.Draw(targetExtent, refreshType);


}


}



[Edit:] Sorry about the formatting of the code... I had to go back and change one line of the code, but apparently it doesn't like me doing that.[/Edit]


 




Thanks, 



.Ryan.



Hi Ryan,


 
Two things need to be taken care of when implement the “MyOverlay” class:
 
1. Merge canvases.
Each overlay has its own canvas, we need to integrate all sub-overlays’ canvases into the canvas of MyOverlay.
 
The code is like this:
 
OverlayCanvas.Children.Add(markerOverlay1.OverlayCanvas);
OverlayCanvas.Children.Add(markerOverlay2.OverlayCanvas);
 
We need to do this manually because WpfMap only collects the canvases of its Overlays property.
 
2. Make sure every sub-overlay has the same map arguments as its container overlay, which is MyOverlay in this case.
 
The code is like this:
 
markerOverlay1.MapArguments = MapArguments;
markerOverlay2.MapArguments = MapArguments;
 
The NullReferenceException you encountered was cause by not setting the sub-overlays’ MapArguments property, this property includes information that an overlay needs when it’s drawing.
 
Please refer to the attached file for more detail and feel free to let us know if you have any more questions.
 
Thanks,
Tsui

MyOverlay.zip (875 Bytes)

Tsui,


Thanks for your help, that solved my NullReference issue.  Now I have to further problems.


1) When the map is panned, none of the overlays in the collection are panned with the map until the user lets go of the mouse button


2) My markers have a tooltip which is never displayed when the user hovers over the marker


 


Any help with these two issues would be greatly appreciated.


Thanks,


 


.Ryan.



An update on issue #2 in my previous post… I’ve found that the tooltip works ONLY on the top-most MarkerOverlayCollection I have (I have multiple MarkerOverlayCollections in on my map)

Hi Ryan,  
  
 Please check if you have overrided the PanToCore method in the custom overlay. We tested with the attached sample and it works fine when panning and displaying the tootip on both sub-overlays. Please have a try. If the issue still exists, I think it’s some template inheritance affects the styles in the Overlay. Could you send us a simple sample to recreate this issue? 
  
 Thanks, 
 Howard

Hi Howard,


I've got the pan working.  For the tooltip issue, my problem isn't when I have mulitple overlays in a single markeroverlaycollection, that works fine.  My problem is when I have multiple markeroverlaycollections.  At that point, only the overlays in the markeroverlaycollection that was last added to the map display a tooltip.  I dont' have any special templates, so I don't think templates are the issue here.


Thanks for your time and help.


.Ryan.



Hi Ryan,
 
We’ve made a demo of adding multiple overlay collections, but we haven’t reproduced the issue yet.
In the demo, we added three overlay collections to the map; each of the overlay collections has two InMemoryMarkerOverlay inside and they all have different icons and tooltips. When we ran the demo, we were able to see all the tooltips.
 
Please compare the demo code attached with this post with your code and let us know what differences they have, so we can get more clues about how to reproduce the problem. It’ll be even better if you can send us a sample that reproduces the problem.
 
Looking forward to your feedback.
 
Regards,
Tsui

post8237.zip (12.9 KB)

Hi,


I've attached a demo showing the problem.  I noticed that this only occurs when I have a LayerOverlay in my collection of overlays also (you can see this in the demo app by commenting out the LayerOverlay)


.Ryan.



tgdemo.zip (32.4 KB)

Hi Ryan, 
  
 I checked your code and found there is one issue. Your OverlayCollection contains two overlays; one is LayerOverlay and another one is a custom MarkerOverlay. Actually, LayerOverlay contains an image; if there is no layers in the LayerOverlay, the image will be cleared by transparent color. The image covers on the another overlay and the markers below cannot raise the mouse event anymore. 
  
 By default, MarkerOverlay must on top of other Overlays; we recommend you to write another overlay to differentiate the z-index of overlay on the map. Hope you understand the reason of this issue and make some changes. 
  
 I’m not quite sure why do you want to do it in this way. If possible, please let us know more of your scenario, we might have a better idea for you. 
  
 Thanks, 
 Howard

Hi Howard,


Thanks for your help.  I basically have a logical grouping of data (lines and points) that are stored in InMemoryFeatureLayer and FeatureSourceMarkerOverlay which are all either visible or not visible at the same time.  It was just easier/less error prone to have them all in a single collection I can control rather than having to manage multiple overlays.  Also this makes it easier to generate a treeview of overlays/layers and such that mean something to the user.  Anyhow, it doesn't sound like this approach will work, so I'll split them up into multiple overlays.


Thanks for your help,


.Ryan.



Hi Ryan, 
  
 I see, thanks for your explanation. There is another option for you which is getting rid of the marker. For example, if you want to simulate the tooltip, we can add an event on the mouse move, and query the feature by a buffered point. Of cause we don’t raise this event whenever the mouse moved. So we need a timer to let the event raises when the mouse stopped moving. In this way, the tree will always display the LayerOverlays and layers. Or if you need some special feature from the marker such as dragging, you can still keep your current method, it is still fine as I thought. 
  
 Hope it helps and feel free to let me know if you have more queries. 
  
 Thanks, 
 Howard