ThinkGeo.com    |     Documentation    |     Premium Support

Concave Polygon Labeling

 Hi,


 


Do you have any features in your labeling system to label concave polygons, like the shapefile attached better.  Right now I believe it is just using the centoid of the polygon and I have tried FittingPolygon and FittingPolygonFactor properties without any luck.


 


I've attached an shapefile I'm trying to label and a screen shot of how its labeling.


 


Thanks



labeltest.zip (2.94 KB)

 Brian,


Thanks for your provided shape files that I can test.


You can set the PolygonLabelingLocationMode to adjust location of label as following code:


textStyle.PolygonLabelingLocationMode = PolygonLabelingLocationMode.BoundingBoxCenter;


Thanks,


James




Thanks James, 



I'll give that a try. 



I ended up yesterday dusting of an old method I implemented on MapSuite V1.5 that would get the bounding box of the label, starts at the centroid of the polygon and then moves it around in a clockwise spiral performing an difference between the polygon and the label bounding box. If there is a result from the difference the text bounding box did not fit inside the polygon and then it moves it a little and tries again. 



Not the most efficent and likely wouldn't work on dynamic maps, but it does a great job of ensuring that the label is in the polygon. My orginal method would even start to scale down the font if it couldn't find a fit. I'm mostly generating a static map that is used for creating a printed document so render time isn't as critical. 



Implemented it as a sub class of TextStyle that overrides the GetLabelingCandidateCore method, I really like how that is a seperate method as it saves me from handling the drawing of the label, I can just hand off the location to the base class. 



Thanks again



That label position is certainly not the center of the bounding box.   How would one surmise that using that PolygonLabelingLocationMode would generate such a nice spot for a label?



Ted, 
  
 Maybe it’s reversed, but I check the code, it show like this 
  switch (PolygonLabelingLocationMode) 
             { 
                 case PolygonLabelingLocationMode.BoundingBoxCenter: 
                     centerPoint = polygon.GetBoundingBox().GetCenterPoint(); 
                     break; 
                 case PolygonLabelingLocationMode.Centroid: 
                 default: 
                     centerPoint = polygon.GetCenterPoint(); 
                     break; 
             } 
  
 So that, it should be right, I will test it and let you know the result. 
  
 Thanks, 
 James

James, 



A bounding box center or centoid of a polygon can still fall outside the boundary of the polygon itself. When you have many polygons near each other, many that could be concave you could have labels placed outside the intended polygon and maybe over another polygn. Which in some uses of maps could cause serious problems for the end user of it. What I'm looking for is a way to be assured that a label will be inside or at least placed over the intended polygon. 



My brut force search method does the job I need for now since I don't have an interactive map, just creating a map to be printed, but I am just wondering if there is any solution in MapSuite to accomplish the same goal. ESRI for example does have a very good and quick polygon labeling method that results in labels always being place inside the intended polygon or not placed at all if it can't be fit. 



Thanks 

Brian



Brian, 
  
 I am afraid that you couldn’t put the label always inside the polygon so far. 
  
 Sorry for inconvenience. 
  
 James

So, what am I missing?   In the initial reply to the original post, you included an image of a label placed in perfect location on the field.   How did that placement/image get done?   Can ThinkGeo place that "1" in that spot, was was that done manually?

Ted, 
  
   I think what happened is that we have two way of labeling the polygons.  The first is the center of the bounding box.  The second if the centroid of the polygon.  The centroid of the polygon is the center of mass I believe however it is possible this may not be in the polygon but generally is.  There are a number if centroid type calculations that can be made.  We can add some new enumerations to do the centroid inside the polygon and try and ensure it is always within.  What I mean by within is the center of the label.  parts of the label could be outside.  We could add a property as well to say how much tolerance you have for a percentage to be outside.  I think we could write a quick and effective way to find the best spot in the polygon.  We would need to add this our feature list if it’s something you want.  I also welcome any other feedback or suggestions to things we can add around this while we are working on it. 
  
 David

David, I just wanted to know if in the second illustration in this thread, that the "1" was placed there by ThinkGeo software, or as an example of where it would be nice if it was placed.   And I questioned that being a "bounding box" placement.   I could see it being a centroid placement. 
  
 The routine that we had in our old COM stuff kept doing inner buffers until you got down to where there was only a small polygon.   That would always be a good location.   You could even do things like double-label, if the original polygon divided into multi-polygons before you got down to a small enough polygon.    But, like Brian said… it was ok for a static map, but not something that worked real well in real-time. 
  


David, I just wanted to know if in the second illustration in this thread, that the "1" was placed there by ThinkGeo software, or as an example of where it would be nice if it was placed.   And I questioned that being a "bounding box" placement.   I could see it being a centroid placement. 
  
 The routine that we had in our old COM stuff kept doing inner buffers until you got down to where there was only a small polygon.   That would always be a good location.   You could even do things like double-label, if the original polygon divided into multi-polygons before you got down to a small enough polygon.    But, like Brian said… it was ok for a static map, but not something that worked real well in real-time. 
  


By the way… I have noticed that the 5.0 software is placing labels in much nicer places than the 4.5 version.   And I think that is because it is using Centroid by default.   I changed no code, but the labels are pretty good, now. 


Ted, 
  
 I can give you some ideas, and I think David will give you more detail answer. 
  
 In second illustration, the “1” was placed by Thinkgeo MapSuite, and if you want to label multi polygons, you can set textStyle. LabelAllPolygonParts to true. 
  
 I am glad you get better result now. 
  
 Thanks, 
 James