ThinkGeo.com    |     Documentation    |     Premium Support

Need to show all labels, all the time

Is there a way to show all of the labels for a particular layer without suppressing any of them? For instance, when I’m zoomed in closely, the labels look like this:



When I zoom out, I still need to show all three, but one of them is suppressed:



The only way I can show all of them is if I allow them to overlap, but then it looks like this:



Is there a way to make the labels all display without overlapping? Here are the current settings on the label style:


ICSnet.Objects.Map.ARGBTextStyle argbTextStyle = new Objects.Map.ARGBTextStyle();
argbTextStyle.OverlappingRule = LabelOverlappingRule.AllowOverlapping;
argbTextStyle.DuplicateRule = LabelDuplicateRule.UnlimitedDuplicateLabels;
argbTextStyle.BestPlacement = true;
argbTextStyle.SuppressPartialLabels = false;

The ARGBTextStyle inherits from the standard TextStyle. I’ve overridden it so I can change the background and text colors. 

And if I change the OverlappingRule to NoOverlapping, I get the second image.

Hi Clay, 
  
 Generally OverlappingRule and DuplicateRule is enough, because our label need to be show in one part of line shape unless you set offset for them, that means when you zoom out to a high level and the three roads will be very short and in a small area, it’s hard to render all labels and make them not overlap. 
  
 But it looks your label haven’t been render in road on map from your 2nd and 3rd screen capture, I think that should be related with your other settings of ARGBTextStyle, could you please let us know more detail about that so we can reproduce it and help you? 
  
 Regards, 
  
 Don

Don, 



These labels are for vehicles on the map. That’s why they need to be shown all the time. Here are all the settings for the style.



The style itself:


public class ARGBTextStyle : TextStyle
    {
        protected override void DrawCore(IEnumerable<Feature> features, GeoCanvas canvas, System.Collections.ObjectModel.Collection<SimpleCandidate> labelsInThisLayer, System.Collections.ObjectModel.Collection<SimpleCandidate> labelsInAllLayers)
        {
            foreach (Feature feature in features)
            {
                int a = int.Parse(feature.ColumnValues[“A”]);
                //a = a / 2; // reduce the alpha to half
                int r = int.Parse(feature.ColumnValues[“R”]);
                int g = int.Parse(feature.ColumnValues[“G”]);
                int b = int.Parse(feature.ColumnValues[“B”]);
                int backgroundA = feature.ColumnValues.ContainsKey(“BackA”) ? int.Parse(feature.ColumnValues[“BackA”]) : 255;
                int backgroundR = feature.ColumnValues.ContainsKey(“BackR”) ? int.Parse(feature.ColumnValues[“BackR”]) : 255;
                int backgroundG = feature.ColumnValues.ContainsKey(“BackG”) ? int.Parse(feature.ColumnValues[“BackG”]) : 255;
                int backgroundB = feature.ColumnValues.ContainsKey(“BackB”) ? int.Parse(feature.ColumnValues[“BackB”]) : 255;
                string fontName = feature.ColumnValues.ContainsKey(“FontName”) ? feature.ColumnValues[“FontName”] : “Segoe UI”;
                int fontSize = feature.ColumnValues.ContainsKey(“FontSize”) ? int.Parse(feature.ColumnValues[“FontSize”]) : 15;
 
                //this.YOffsetInPixel = 20;
                //this.FillSolidBrush = new GeoSolidBrush(GeoColor.FromArgb(a, r, g, b)); // might need to add a label color 
                this.TextColumnName = “Name”;
                this.TextSolidBrush = new GeoSolidBrush(GeoColor.FromArgb(a, r, g, b)); // might need to add a label color 
                //this.FillSolidBrush = new GeoSolidBrush(GeoColor.StandardColors.Black);
                this.MaskType = ThinkGeo.MapSuite.Core.MaskType.RoundedCorners;
                this.Mask = new AreaStyle(new GeoPen(GeoColor.FromArgb(a, r, g, b), 2), new GeoSolidBrush(GeoColor.FromArgb(backgroundA, backgroundR, backgroundG, backgroundB)));
                this.MaskMargin = 2;
 
                this.Font = new GeoFont(fontName, fontSize, DrawingFontStyles.Bold);
                //this.TextColumn = “Name”;
 
                Collection<Feature> drawFeature = new Collection<Feature>();
                drawFeature.Add(feature);
                //DrawCore(features, canvas, labelsInThisLayer, labelsInAllLayers);
                base.DrawCore(drawFeature, canvas, labelsInThisLayer, labelsInAllLayers);
            }
 
 
 
        }
    }





The instantiation of it:


ICSnet.Objects.Map.ARGBTextStyle argbTextStyle = new Objects.Map.ARGBTextStyle();
argbTextStyle.OverlappingRule = LabelOverlappingRule.NoOverlapping;
argbTextStyle.DuplicateRule = LabelDuplicateRule.UnlimitedDuplicateLabels;
argbTextStyle.BestPlacement = true;
argbTextStyle.SuppressPartialLabels = false;
                 
argbTextStyle.RequiredColumnNames.Add(“A”);
argbTextStyle.RequiredColumnNames.Add(“R”);
argbTextStyle.RequiredColumnNames.Add(“G”);
argbTextStyle.RequiredColumnNames.Add(“B”);
argbTextStyle.RequiredColumnNames.Add(“BackA”);
argbTextStyle.RequiredColumnNames.Add(“BackR”);
argbTextStyle.RequiredColumnNames.Add(“BackG”);
argbTextStyle.RequiredColumnNames.Add(“BackB”);
argbTextStyle.RequiredColumnNames.Add(“Name”);
argbTextStyle.RequiredColumnNames.Add(“FontName”);
argbTextStyle.RequiredColumnNames.Add(“FontSize”);
 
argbTextStyle.Mask = new AreaStyle(new GeoSolidBrush(GeoColor.StandardColors.Black));
 
argbTextStyle.PointPlacement = PointPlacement.UpperCenter;
argbTextStyle.YOffsetInPixel = 20;





Hi Clay, 
  
 Thanks for your detail code, I tried that and found we cannot make each label shows well if you zoom out to high, but we can make the label looks better when some part overlap by other labels. 
  
 Please modify your code like this: 
  
 
argbTextStyle.OverlappingRule = LabelOverlappingRule.AllowOverlapping;  // Set allow overlapping

this.Mask = new AreaStyle(new GeoPen(GeoColor.FromArgb(a, r, g, b), 2), new GeoSolidBrush(GeoColor.FromArgb(backgroundA, backgroundR, backgroundG, backgroundB)));
this.Mask.DrawingLevel = ThinkGeo.MapSuite.Core.DrawingLevel.LabelLevel; // Add this line after assign value to Mask
 
  
 Do you think that looks better now? 
  
 If you think the text cannot be watch well, I think you can try to just use different color as label and show legend for them. 
  
 Regards, 
  
 Don