ThinkGeo.com    |     Documentation    |     Premium Support

Features showing in HighlightOverlay when mouse is not over them

I am currently using MapSuite 3.0 Web Edition and I have run into an issue. Whenever I add features to my map's highlight layer (with the intent that they be highilghted upon hover), the elements are visible even when the mouse is not hovering over the feature (specifically, I am adding a Feature created from a LineShape to the HighlightOverlay, and the HighlightOverlay has a thin blue line in it wherever the LineShape is). The highlight layer otherwise works correctly (when I hover over it, the features "light up"), but I do not want the thin blue line to be visible when the mouse is not hovering over it, and I have no idea why the thin blue line is being shown.



We have an example of that in the "How Do I"  samples "Highlight a feature while Hovering" in the "Overlays" section. It shows how to do exactely what you are doing exept that it is using polygons instead of lines. I suggest you check that out if you have not already. If you still cannot figure out what is going on, please send us your code and we will see if there is something wrong with it. Thank you.

Posted By Val on 03-22-2010 01:30 PM 

We have an example of that in the "How Do I" samples "Highlight a feature while Hovering" in the "Overlays" section. It shows how to do exactely what you are doing exept that it is using polygons instead of lines. I suggest you check that out if you have not already. If you still cannot figure out what is going on, please send us your code and we will see if there is something wrong with it. Thank you. 



 


Perhaps my question was unclear. The problem is that features are being shown in the HighlightOverlay after they are added to it, regardless of whether or not the mouse is hovering over them. In the example, the features in the HighlightOverlay are invisible until the mouse passes over them (though they are not invisible in the overlay beneath the HighlightOverlay). This is the behavior I want to capture. The relevant code is essentially:


AddPointsToHighlight(List<Vertex> points)

{

 map.HighlightOverlay.IsVisible = true;

 map.HighlightOverlay.FeatureSource.Projection = new  Proj4Projection(Proj4Projection.GetEpsgParametersString(4326), Proj4Projection.GetGoogleMapParametersString());

 map.HighlightOverlay.HighlightStyle.OutlineColor = GeoColor.FromArgb(120, GeoColor.StandardColors.White);

 map.HighlightOverlay.HighlightStyle.FillColor = GeoColor.FromArgb(120, GeoColor.StandardColors.OrangeRed);

 map.HighlightOverlay.HighlightStyle.OutlineWidth = 3;

 map.HighlightOverlay.Features.Clear();

 map.HighlightOverlay.Features.Add(new Feature(new LineShape(points)));

}


I have tried numerous different ways of adding the relevant lines to the HighlightOverlay, but they all results in the blue line being drawn, leading me to believe that there is some property of the HighlightOverlay that needs to be set to tell it to not draw any features unless they are hovered over.



Ok, now I know what you are looking for exactely. Sorry for not understanding earlier. To have only the feature being hovered on to light up and the other features being left alone, you need to set the property Style to a FeatureOverlayStyle with no brush or pen. So to take the example of the US states as in the sample "Hightlight Features While Hovering", see the code below:


 


statesLayer.Open();
 Map1.HighlightOverlay.Style = new FeatureOverlayStyle(); 
 Map1.HighlightOverlay.HighlightStyle = new FeatureOverlayStyle(GeoColor.FromArgb(120, GeoColor.StandardColors.OrangeRed), GeoColor.StandardColors.Red, 1);
 
foreach (Feature feature in statesLayer.FeatureSource.GetAllFeatures(ReturningColumnsType.NoColumns))
   {
         Map1.HighlightOverlay.Features.Add(feature.Id, feature);
  }
statesLayer.Close();

Posted By Val on 03-23-2010 06:25 PM 

Ok, now I know what you are looking for exactely. Sorry for not understanding earlier. To have only the feature being hovered on to light up and the other features being left alone, you need to set the property Style to a FeatureOverlayStyle with no brush or pen. So to take the example of the US states as in the sample “Hightlight Features While Hovering”, see the code below:


 


statesLayer.Open();
 Map1.HighlightOverlay.Style = new FeatureOverlayStyle(); 
 Map1.HighlightOverlay.HighlightStyle = new FeatureOverlayStyle(GeoColor.FromArgb(120, GeoColor.StandardColors.OrangeRed), GeoColor.StandardColors.Red, 1);
 
foreach (Feature feature in statesLayer.FeatureSource.GetAllFeatures(ReturningColumnsType.NoColumns))
   {
         Map1.HighlightOverlay.Features.Add(feature.Id, feature);
  }
statesLayer.Close();


Thank you for your responses. Your explanation makes sense, however when I set HighlightOverlay.Style to a new FeatureOverlayStyle() and change nothing else, the HighlightOverlay stops working entirely. I also tried setting HighlightOverlay.Style to a new FeatureOverlayStyle with GeoColor.SimpleColors.Transparent for an OutlineColor and FillColor, and the results are identical (the HighilghtOverlay doesn’t work at all). Any ideas?



To demonstrate my point I simply added the line of code Map1.HighlightOverlay.Style = new FeatureOverlayStyle();  to the sample "Highlight Features While Hovering" and this is working as expected. To see what is going on on your side, I would have to see your code and how you are using the HighlightOverlay. The best would be that you send us a self contained sample app that we can run and see the problem happening. If this is a little bit difficult right now for you, can you send the code relevant to HighlightOverlay? Thank you.



Posted By Val on 03-24-2010 10:38 AM 

To demonstrate my point I simply added the line of code Map1.HighlightOverlay.Style = new FeatureOverlayStyle();  to the sample “Highlight Features While Hovering” and this is working as expected. To see what is going on on your side, I would have to see your code and how you are using the HighlightOverlay. The best would be that you send us a self contained sample app that we can run and see the problem happening. If this is a little bit difficult right now for you, can you send the code relevant to HighlightOverlay? Thank you.



All of the code dealing with the HighlightOverlay is essentially what I previously posted. It looks like:


 



        private void ConfigureHighlightOverlay()
        {
            map.HighlightOverlay.IsVisible = true;
            //map.HighlightOverlay.Style = new FeatureOverlayStyle(); // When uncommented, this causes the HighlightOverlay to not work at all
            //map.HighlightOverlay.Style = new FeatureOverlayStyle(GeoColor.SimpleColors.Black, GeoColor.SimpleColors.Transparent, 3); // When uncommented, this causes the HighlightOverlay to not work at all
            //map.HighlightOverlay.Style = new FeatureOverlayStyle(GeoColor.SimpleColors.Transparent, GeoColor.SimpleColors.Black, 3); // When uncommented, the HighlightOverlay works, but the feature is drawn in it even when not hovering
            map.HighlightOverlay.FeatureSource.Projection = new Proj4Projection(Proj4Projection.GetEpsgParametersString(4326), Proj4Projection.GetGoogleMapParametersString());
            map.HighlightOverlay.HighlightStyle.OutlineColor = GeoColor.FromArgb(120, GeoColor.StandardColors.White);
            map.HighlightOverlay.HighlightStyle.FillColor = GeoColor.FromArgb(120, GeoColor.StandardColors.OrangeRed);
            map.HighlightOverlay.HighlightStyle.OutlineWidth = 3;
        }

        private void AddPointsToHighlight(List<Vertex> points)
        {
            map.HighlightOverlay.Features.Add(new Feature(new LineShape(points)));
        }

My code is essentially identical to the above and nothing else interacts with the HighlightOverlay. The ConfigureHighlightOverlay() function is being called before the layer is populated through numerous calls to AddPointsToHighlight(). The only thing I am changing between runs is which of the commented lines is uncommented. If the HighlightOverlay.Style.FillColor is set to GeoColor.SimpleColors.Transparent, or if the HighlightOverlay.Style is set to a new FeatureOverlayStyle(), the highlight overlay does not function. If the HighlightOverlay.Style.FillColor is set to anything else (or if I don’t set HighlightOverlay.Style at all), the highlight overlay functions, but the features I add to it are visible even when not hovering.



In the example I tested, the shape type is PolygonShape. In your case, you are using LineShape. It might be that there is a bug related to the shape type if this a LineShape. Let us do some testing and we will let you know. Thank you.

Hi, Adam



Yes, you are right. When you add LineShape to HightlightOverlay; the renderer will use the outline color to draw this shape, so if you set the outline color to transparent(the outline color is transparent if you initialize a new FeatureOverlayStyle by default ) and then it won't take effect when you hover it. Here is a workaround for you. You just need to transform this line shape to polygon shape using the Buffer method of BaseShape, and then it will take effect. Please refer to the code in the attachment.



Thanks,

Khalil



1909-HighlightFeaturesWhileHovering.zip (2.43 KB)

Posted By Khalil on 03-25-2010 12:53 AM 

Hi, Adam



Yes, you are right. When you add LineShape to HightlightOverlay; the renderer will use the outline color to draw this shape, so if you set the outline color to transparent(the outline color is transparent if you initialize a new FeatureOverlayStyle by default ) and then it won’t take effect when you hover it. Here is a workaround for you. You just need to transform this line shape to polygon shape using the Buffer method of BaseShape, and then it will take effect. Please refer to the code in the attachment.



Thanks,

Khalil







 


Thank you for your time and attention. Unfortunately, the posted workaround is not usable for our purposes for two reasons. First, calculating the buffer for the LineShape we are using takes an extremely long time. Second, unless I am mistaken, since the buffer is a feature its width (distance from the line) would be calculated in the map space, while hovering is determined based upon the mouse position in the screen space. Consequently, no matter what I set the width of the buffer to be, at some zoom levels it could potentially be wider than the original line (causing highlighting to occur when the mouse pointer was merely near the line), while at other zoom levels (e.g. when at zoom level 20), the polygon would be thinner than the original line (causing highlighting to occur only while near the center of the line).



We are aware of those limitations and this is why we are working on the definitive solution. You should have more detailed explanations on the fix from Khalil tomorrow. Thank you.

I have a follow up question. In the sample "Highlight Feature when Hovering", you can see the feature (its shape) lighting up when hovering with the mouse. Is it possible with HighlightOverlay to also have some labels displaying. For example, what if I want to see the state name and some other column values as labels in addition to its shape being lighted up. Can I currently do that and if not, what can this be accomplished? Thank you.

Hi, Adolfo


We don' support that. However, you could show tooltips for your interesting pleces using callback technology. I made a sample for you with state shape file data and it works fine.  Please have a try.


Thanks,


Khalil


 



1913-ShowTooltip.zip (95.8 KB)