ThinkGeo.com    |     Documentation    |     Premium Support

Label position on the edge of polygon

Hello,


I have a polygon shapefile and I want to display labels. Right now it displays the labels in the center (inside) of the polygon,  but I would like to display the labels on the edge of polygons and not inside.


Here is what I’m getting now (a little confusing with overlapping polygons):




And here is what I need:


Thank you,

Inna



Hi Inna, 
  
 I think directly set DefaultTextStyle cannot make the label shows so well like your second screen shot. 
  
 Could you try to calculate special points from polygons which won’t shown in map and label on them? So you will get a better render. 
  
 Regards, 
  
 Don

Would it be possible to add a new PolygonLabelingLocationMode=Border type and make the same text style behavior as you currently have for lines?

Hi Inna, 
  
 We can make the label shows for line, just get all outter ring of polygons, convert them to lines, and label on it. 
  
 But I think it won’t looks same as your second screen shot. Because label for line will follow the line direction but not be horizontal string. 
  
 I think we don’t have a plan to add PolygonLabelingLocationMode=Border property for now, but you can implement it by write your custom textstyle. 
  
 Regards, 
  
 Don

Hi Don,


Displaying labels for lines it is also a good option.  Could you please suggest how to implement this?


I tried to expand TextStyle class to display label for the first vertex in outerring, but I still have the overlapping problem. Maybe you can help me with this also.


Thanks,

Inna



Hi Inna, 



Here is simple sample for get outer line of a polygon: 




PolygonShape poly = new PolygonShape();
LineShape outerLine = new LineShape(poly.OuterRing.Vertices); 
 



But I still suggest you label on point.  If you label on line you have to take more time to adjust it. 



It looks your labels are not crowded. Could you upload a image to show how overlapping?  

Try to set this for avoid overlap: layer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle.OverlappingRule = LabelOverlappingRule.NoOverlapping; 



Regards, 



Don

Hi Don,


 


I initially was using canvas.DrawTextWithWorldCoordinate(sVal, m_TextStyle.Font, m_TextStyle.TextSolidBrush, m_TextStyle.HaloPen, polygonShape.OuterRing.Vertices.First().X, polygonShape.OuterRing.Vertices.First().Y, DrawingLevel.LabelLevel)  and it didn’t work with overlapping labels.


I changed my code and now I’m using textStyle.Draw(new Collection<Feature> { point.GetFeature(feature.ColumnValues) }, canvas, labelsInThisLayer, labelsInAllLayers); and it works as it should be.


 


Thank you very much for your advice.


 


Inna



Hi Inna, 
  
 I am glad to hear your problem solved and thanks for share your experience about it! 
  
 Regards, 
  
 Don