ThinkGeo.com    |     Documentation    |     Premium Support

CustomTextStyles

I would like labels on a street shapfile layer to be associated with ZoomLevels.  For example, at a low ZoomLevel (01) I would like only labels for Interstates, but a high ZoomLevel(20) would like all labels displayed.  Also want several other label levels in between 01 and 20.


I have applied CustomStyles at various zoom levels when rendering the actual lines for the streets and now want to apply custom styles to labeling.


I have made use of the ValueItem and ValueStyle classes for the lines and that works just fine.


Is there any sample code that shows how to do the same with labeling?


Regards,


Dennis


 



Hello Dennis, 



Thank you for your post, we have some easy way to do this, let’s say you have three layers (interstates, highways, side streets); every layer has its own LineStyles and ZoomLevel settings; for example: 


interstatesLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.Interstate1;
interstatesLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

highwaysLayer.ZoomLevelSet.ZoomLevel06.DefaultLineStyle = LineStyles.Highway1;
highwaysLayer.ZoomLevelSet.ZoomLevel06.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

sideStreetsLayer.ZoomLevelSet.ZoomLevel16.DefaultLineStyle = LineStyles.LocalRoad1;
sideStreetsLayer.ZoomLevelSet.ZoomLevel16.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;




Then the layer will show only in right zoomlevels. 



Hope it makes sense. Any queries please let me know. 



Regards, 



Gary



Dennis,


 I don't think that Gary responded exactely to your question. Before, we work on some sample for you, I want to make sure that I understand precisely what you are asking. What you want to acomplish is basically a Value Text Style where the font used depends on the value of a column. For example, you want to have the label for streets of type "major" using a certain font, streets of type "minor" using another font etc. Do I understand correctely your requirement?



Val, 



I am talking about applying this to an individual layer. So yes, you understand what my question is. 



But I also want to control when labeling comes on for different streets types. For example, labels would always be on for Interstates, but labels would only be on for small streets when the zoom level is 15 or above, for example.


I did basically the same thing with an individual layer when rendering the street lines.  Made use of ValueItem, ValueStyle, and CustomStyle to render the lines according to the value of a column in the layer.


It looks to me like MapSuite provides a similiar paradigm for labeling, but I've not been able to put the pieces together.



Thanks for getting back to me, 

Dennis 

 



Dennis,


 You can use ValueStyle for this purpose. Below is an example using the country shapefile where I display the landlocked country labels with one TextStyle and the non landlocked country labels with another TextStyle. Notice that the labels for the landlocked countries take precedence over the labels for the non landlocked countries. I think that from this simple example, you can easily adapt it for your street case. This is the same principle to apply.




//Sets the TextStyle based on the column value of "LANDLOCKED"
    TextStyle landLockedTextStyle = new TextStyle("CNTRY_NAME", new GeoFont("Arial", 16), new GeoSolidBrush(GeoColor.StandardColors.Red));
    landLockedTextStyle.OverlappingRule = LabelOverlappingRule.NoOverlapping; 
    TextStyle noLandLockedTextStyle = new TextStyle("CNTRY_NAME", new GeoFont("Arial", 12), new GeoSolidBrush(GeoColor.StandardColors.Black));

    ValueStyle valueStyle = new ValueStyle();
    valueStyle.ColumnName = "LANDLOCKED";
    valueStyle.ValueItems.Add(new ValueItem("Y", landLockedTextStyle)); //We add landlocked first so it takes precendence on others
    valueStyle.ValueItems.Add(new ValueItem("N", noLandLockedTextStyle));

    worldLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(valueStyle);
    worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;


Dennis,


 I forgot to address the zoom level (or scale) issue. To display differently based on the zoom level, you need to use the different ZoomLevels and apply until the adequate zoom level. From Zoom level 1( world view) to Zoom level 20 is (street view). Also, if you don't like our default zoom levels, you can create your own custom ones. Please, look at the sample apps in the in the Code Community for that: wiki.thinkgeo.com/wiki/Map_Suite_De...ng_Samples


Thank you.



Val, 



Your example code helped me put the pieces together.


I added labeling by zoom level as well and that all workes nicely.


Thanks for the tip on custom zoom levels, I will definately take a look at that.



Thanks very much, 

Dennis 

 



Dennis,


  I am glad we have something working now. Any other questions, let us know. Thank you.