ThinkGeo.com    |     Documentation    |     Premium Support

TextStyle not shown on certain zoom levels, and cut off sometimes



I have two problems with TextStyle objects on my InMemoryFeatureLayer. 



1. Some of the text values do not get displayed until a certain zoom level.  Points that are nearby each other are being hidden.  However, as per the documentation, I have set the zoomlevel01 ApplyUntilZoomLevel, but it does not seem to take effect.  

2. Sometimes when zooming in/out, some of the text values get partially chopped off.  



Please see the screenshots for examples.



Here at zoom=8 (my default setting), some text is missing:





When user zooms in to zoom=9, the text is now shown.  However, also notice my #2 issue which is the other text being chopped off.





A little background about my code.  I read values from my application database and some custom calculations, and create an InMemoryFeatureLayer with a FeatureSourceColumn for my “AQI” value.  The TextStyle starting at line 28 is the part which is having trouble.

As you can see I tried setting the GridSize=1… this seems to help a little, but still not all of the text values are displayed.




01.var inMemoryFeatureLayer = new InMemoryFeatureLayer();
02.inMemoryFeatureLayer.FeatureSource.Open();
03.// specify the AQI column for the text display
04.inMemoryFeatureLayer.Columns.Add(new FeatureSourceColumn(“AQI”“String”, 10));
05. 
06.//Loop through all the point data from my application (_siteAqiData) and add it to the in-memory layer
07.foreach (KeyValuePair<PointShape, double?> pair in _siteAqiData)
08.{
09.    if (pair.Value.HasValue)
10.    {
11.        var feature = new Feature(pair.Key);
12.        feature.ColumnValues.Add(“AQI”, pair.Value.Value.ToString(CultureInfo.InvariantCulture));
13.        inMemoryFeatureLayer.InternalFeatures.Add(feature);
14.    }
15.}
16.//Now that all of the data is added we can build an in memory index to make the lookups fast
17.inMemoryFeatureLayer.BuildIndex();
18. 
19.if (_createPointStyle)
20.{
21.    //Create the site point style
22.    PointStyle pointStyle1 = PointStyles.CreateSimpleCircleStyle(GeoColor.StandardColors.White, 4,
23.        GeoColor.SimpleColors.Black, 2);
24.     inMemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(pointStyle1);
25.}
26. 
27.//***********NOTE******* This is the TextStyle which is having the problem
28.TextStyle textStyle = TextStyles.CreateSimpleTextStyle(“AQI”“Arial”, 12, DrawingFontStyles.Regular, GeoColor.SimpleColors.BrightBlue);
29.textStyle.HaloPen = new GeoPen(GeoColor.StandardColors.White, 3);
30.textStyle.PointPlacement = PointPlacement.UpperCenter;
31.textStyle.YOffsetInPixel = 5;
32.textStyle.DuplicateRule = LabelDuplicateRule.UnlimitedDuplicateLabels;
33.textStyle.GridSize = 1; 
34. 
35.//Apply these styles at all levels and add then to the custom styles for the layer
36.inMemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
37.inMemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(textStyle);






Hi Randy,



Normally, the issues are related with the settings of the text style. From the first image, I guess this is because the label "56" is overlapped by "95" and in this case, the "56" will be hidden. I think you can try to setting the OverlappingRule property as AllowOverlapping.



For the cut-off label, setting a big value like 100/200 for the gridsize might be helpful. Another way is using singleTile on the LayerOverLayer, single tile can avoid this issue completely. 




LayerOverlay overlay = new LayerOverlay();
                overlay.IsBaseOverlay = false;
                overlay.TileType = TileType.SingleTile;
                overlay.Layers.Add(inMemoryFeatureLayer);

If the issues still persists, would you mind to export your inmemoryfeaturelayer data for us? so that would be very easy for us to find out the exact reason.



Thanks,



Troy

Thank you for clarifying.  
 1. It was indeed overlap.  Even though it didn’t look like it was overlapping, I tried changing the overlap rule to AllowOverlapping and the numbers showed up. 
 2. I changed to SingleTile and the problem is fixed. 
  
 New question, related to #1:  If I set the rule to NoOverlapping, what is the best way to choose which feature gets displayed when overlapping causes one to be hidden?  For example in my application, the highest AQI values are the most critical, so we need to choose the highest for display when overlapping happens.  So if two values overlap such as 50 and 90, how can I ensure that the 90 gets shown instead of the 50? 
  
  


Hi Randy,



I think this is a special case and we don’t provide such API, but I think we can define a custom text style by ordering the drawn features to met the case. Here are some codes:


public class OrderedTextStyle : TextStyle
    {
        protected override void DrawCore(System.Collections.Generic.IEnumerable<Feature> features, GeoCanvas canvas, System.Collections.ObjectModel.Collection<SimpleCandidate> labelsInThisLayer, System.Collections.ObjectModel.Collection<SimpleCandidate> labelsInAllLayers)
        {
            features = features.OrderByDescending(t => t.ColumnValues[“Value”]);
            base.DrawCore(features, canvas, labelsInThisLayer, labelsInAllLayers);
        }
    }

You can define more constructors for it and then use this style instead of the textstyle.

Please try it and let us know if any questions.



Thanks,



Troy




Thanks!  That was exactly what I needed… Well almost, I had to convert the column values to numeric format using something like this: 
  
  
OrderByDescending(t => double.Parse(t.ColumnValues[_orderColumnName]))
 
  
 Seems to be working as desired now.

Great, if any other questions, don’t hesitate to let us know. 
  
 Thanks, 
  
 Troy