ThinkGeo.com    |     Documentation    |     Premium Support

"CallOuts" for lable dipaly on map

Hi,


        I have placed marker lables with marker images for display vehicle positions on the map.But problem is that when vehicles are operlapping each other or very close to each other then we are not able to view all lables properly (because of operlapping).So we used following proprty for label.So in case of operlapping at a time we can show only one label.


          markerLabelsOverlay.ZoomLevelSet.ZoomLevel01.DefaultTextStyle.OverlappingRule = LabelOverlappingRule.NoOverlapping;


Example of operlapping vehicles with lable.



 


But now I want to display labels for all vehicles,including overlapping vehicles also.So,Does Thinkgeo has "CallOuts" like following image? So when two vehicles are very close or overlap each other ,then lable can be moved away.so we can see all lable contents clearly.


 



 


I hope you understand both the case here.


Looking forward to your reply


 


Thanks


 


   



 


Hi Badal,
Sorry we are unable to do it directly for dynamic drawing. We just can display the “callouts” labels for static layers. In other words, the image for the layer is unable to change once it’s created, because we have to create it manually. Please take a look at the code sample “Dragged PointStyle with Label”  wiki.thinkgeo.com/wiki/Map_Suite_Desktop_Edition_All_Samples#Dragged_Point_Style . To create the “callouts” labels, please run the application and drag a point to the place where we would like, after that, save and paste it to the cache directory.
To get around it, we can create a CustomTextStyle inherited from TextStyle and overwrite the DrawCore method to change the label’s coordinates.
Any questions please let us know. Thanks,
Johnny

Hello, 
  
 Here static will not work since vehicles are moving. 
 Is there any way by which can i know that these two labels are overlapping? If i know this then i may draw one arrow and move the label to safe distant.    i know this may be tricky since the zoom-in and zoomout functionality is in place. Is there any way by which when we do zoom the arrow width gets adjusted accordingly?  :) 
  
 Thanks

 


Hi Badal,
Yes, the sample just applies to static layers. To get around your scenario, the best way is overwriting the DrawCore method of TextStyle. In that method, we can get the Labels in the drawing layer and all the labels in other layers, and then we can get the PolygonShape of each label to check the overlapping, such as hints in the following code:


    public class CustomTextStyle : TextStyle
    {
        protected override void DrawCore(IEnumerable<Feature> features, GeoCanvas canvas, Collection<SimpleCandidate> labelsInThisLayer, Collection<SimpleCandidate> labelsInAllLayers)
        {
            // Todo: Before drawing, we can get all the darwing labels from parameter "labelsInThisLayer"
            foreach (SimpleCandidate item in labelsInThisLayer)
            {
                PolygonShape labelPolygon = item.SimplePolygonInScreenCoordinate;

                // Todo: here check whether the labelPolygon intersects with other labels.
            }

            base.DrawCore(features, canvas, labelsInThisLayer, labelsInAllLayers);
        }
    }


Thanks,
Johnny