ThinkGeo.com    |     Documentation    |     Premium Support

Control Labeling of GeometryCollectionShapes

Guys,


I have a feature whoes shape is a GeometryCollectionShape that contains a PolygonShape and LineShape.  If I apply a TextStyle to this feature labels are being applied based on the line shape.  However, i will like labels to be applied according to the polygon boundaries instead so that they appear at the center of this polygon.


Even better will be the ability to label based on line and polygon shapes so that i can turn one off based on how the shapes are related.


How can I do this?


TIA,




 



 


Klaus,
 
I have tested following your description but the result is different, both PolygonShape and LineShape in GeometryCollectionShape will be labeling, please look at my sample code below.
 
winformsMap1.CurrentExtent = new RectangleShape(25, 75, 75, 25);
winformsMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.StandardColors.White);
 
InMemoryFeatureLayer inMemoryLayer = new InMemoryFeatureLayer();
PolygonShape polygon = new PolygonShape("POLYGON((10 60,40 70,30 85, 10 60))");
LineShape line = new LineShape("LINESTRING(60 60, 70 70,75 60, 80 70, 85 60,95 80)");
Feature feature = new Feature(new GeometryCollectionShape(new BaseShape[] { line, polygon }));
feature.ColumnValues.Add("test", "this is a label");
inMemoryLayer.InternalFeatures.Add(feature);
inMemoryLayer.Open();
inMemoryLayer.Columns.Add(new FeatureSourceColumn("test"));
inMemoryLayer.Close();
 
inMemoryLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.FillSolidBrush.Color = GeoColor.FromArgb(100, GeoColor.StandardColors.RoyalBlue);
inMemoryLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Color = GeoColor.StandardColors.Blue;
inMemoryLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle.OuterPen = new GeoPen(GeoColor.FromArgb(200, GeoColor.StandardColors.Red), 5);
inMemoryLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = new TextStyle("test", new GeoFont("Arial", 10), new GeoSolidBrush(GeoColor.SimpleColors.Black));
inMemoryLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
 
LayerOverlay staticOverlay = new LayerOverlay();
staticOverlay.Layers.Add("InMemoryFeatureLayer", inMemoryLayer);
winformsMap1.Overlays.Add("InMemoryOverlay", staticOverlay);
 
winformsMap1.Refresh();

 
Thanks,
 
James



James, thanks for the response.  There was a bug in my code.    There is a label applied to both shapes indeed. 

Using your example, what trick can I use to prevent line from being labeled?



Klaus,


 


You can extend TextStyle to implement it, I attached the sample code you can refer to:


 


    class CustomTextStyle : TextStyle


    {


        protected override Collection<LabelingCandidate> GetLabelingCandidateCore(Feature feature, GeoCanvas canvas)


        {


            WellKnownType shapeType = feature.GetWellKnownType();


          


            if (shapeType == WellKnownType.Line || shapeType == WellKnownType.Multiline)


            {


                return new Collection<LabelingCandidate>();


            }


 


            return base.GetLabelingCandidateCore(feature, canvas);


        }


    }


 


            TextStyle textStyle = new CustomTextStyle();


            textStyle.TextColumnName = "test";


            textStyle.Font = new GeoFont("Arial", 10);


            textStyle.TextSolidBrush = new GeoSolidBrush(GeoColor.SimpleColors.Black);


            inMemoryLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = textStyle;


 


 


Thanks,


 


James


 



 Magical.  Thank you James.



You’re welcome, Klaus.