ThinkGeo.com    |     Documentation    |     Premium Support

Dynamic labelling









Hi


 


How do I display labeling or say dynamic labeling for line type features.


 


I have one line type shape file (this displays only layers between 4-15 zoom levels) and have another shape file for label (this displays layers with labels between 15-20 zoom levels).  Reason we need these 2 layers to control and display layer at certain zoom level.


 


All works fine, I can get layers with labels at different zoom level.  But when I span map towards line direction flow, label for that layer is not shown. How do I repeat label on map span for same line


 


Thanks


Hiren




Hiren, 
  
 I think your line layer was added to StaticOverlay and the Label layer was added to DynamicOverlay, right? The StaticOverlay’s TileType is MultipleTile by default while the DynamicOverlay’s one is SingleTile, that’s why the line and the label are displayed in different ways. Just change the DynamicOverlay.TileType to MultipleTile and you will see the label is also displayed on map span. 
  
 LayerOverlay has 2 TileTypes, MultipleTile means the required image is splitted to tiles and the requests for each tile is sent separately; if we set it to the other mode SingleTile though, there will only have one request for the whole image, and it will be sent on MouseUp event rather than MouseMoving.  
   
 Let us know if you have any issues. 
  
 Thanks, 
  
 Ben 
  













Hi Ben,


 


Thanks for reply.


I tried with multiple tiling, but then rendering became too slow. Which was not acceptable by user? It did not even display dynamic label on spanning the map.


I have total 11 shape layers on map (Total 22, out of which 11 is Actual layers and rest 11 for label). All these layers added to CustomOverlayes.


 


Below is code for one of label layer.



 



 


if (Convert.ToInt32(dsAppConfig.Tables[1].DefaultView[0]["lbl_status"]) != 0) //At label level


{


      sl.lyr_line_Buried_Cable_lbl = GetShapeFileFeatureLayer(sShapeFilePath);


 


      iZoomLevelStart_lbl = Convert.ToInt32(dsAppConfig.Tables[1].DefaultView[0]["labelscaleupper"]); //18;


      sZoomlevelEnd_lbl = sLevel + dsAppConfig.Tables[1].DefaultView[0]["labelscalelower"].ToString(); // "Level20";


      // Create text style by column name. 


      color = GetGeoColor(slabelfontcolor);

      drawingfontstyles = GetDrawingFontStyles(slabeldrawingfontstyles);


      textStyle = TextStyles.CreateSimpleTextStyle(sDisplayColName, slabelfontfamilyname, flabelfontsize, drawingfontstyles, color, flabelxoffset, flabelyoffset);


      textStyle.AllowLineCarriage = true;


      textStyle.BestPlacement = true;


      textStyle.OverlappingRule = LabelOverlappingRule.NoOverlapping;


      textStyle.DuplicateRule = LabelDuplicateRule.UnlimitedDuplicateLabels;


      


      applyUntilZoomlevel_lbl = (ApplyUntilZoomLevel)Enum.Parse(typeof(ApplyUntilZoomLevel), sZoomlevelEnd_lbl);

      zoomLevelSet_lbl = sl.lyr_line_Buried_Cable_lbl.ZoomLevelSet;


      startZoomLevel_lbl = zoomLevelSet_lbl.GetZoomLevels()[iZoomLevelStart_lbl];


      startZoomLevel_lbl.DefaultLineStyle = linestyle;


      startZoomLevel_lbl.DefaultTextStyle = textStyle;


      startZoomLevel_lbl.ApplyUntilZoomLevel = applyUntilZoomlevel_lbl;


 


      sl.lyr_line_Buried_Cable_lbl.DrawingMarginPercentage = fDrawingMarginPercentage;


 


      Proj4Projection proj4_lines_Buried_Cable_lbl = new Proj4Projection();


      proj4_lines_Buried_Cable_lbl.InternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(4326);


      proj4_lines_Buried_Cable_lbl.ExternalProjectionParametersString = Proj4Projection.GetGoogleMapParametersString();


      sl.lyr_line_Buried_Cable_lbl.FeatureSource.Projection = proj4_lines_Buried_Cable_lbl;


 


      layerOverLay.Layers.Add("Lbl_Buried_Cable", sl.lyr_line_Buried_Cable_lbl);


      sl.lyr_line_Buried_Cable_lbl.IsVisible = Convert.ToInt32(dsAppConfig.Tables[1].DefaultView[0]["lbl_status"]) == 1 ? true : false;


}     


 


================== Map properties ========


Below are map properties setting at page load


 


#region Set Map Properties and values


string sUnit = "Meter";


Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#B3C6D4"));


Map1.CurrentExtent = new RectangleShape(-13939426.6371, 6701997.4056, -7812401.86, 2626987.386962);


Map1.MapTools.PanZoom.Enabled = false;


Map1.MapTools.PanZoomBar.Enabled = true;


Map1.MapUnit = (GeographyUnit)Enum.Parse(typeof(GeographyUnit), sUnit);


 


layerOverLay = new LayerOverlay("OSPFM Layers");



layerOverLay.IsBaseOverlay = false;


layerOverLay.ClientCache.CacheId = "OSPFM_Layers";


layerOverLay.TransitionEffect = TransitionEffect.None;


layerOverLay.TileType = TileType.SingleTile;


layerOverLay.Layers.Clear();


 


//# end of Map properties


#endregion


 


 


Thanks


Hiren



Hiren, 
  
 As it is a performance problem which cannot find out the reason until getting the whole code which related to map configuration; could you please provide us more code so that we can figure out the reason; it is great if you paste your code into a text file and upload here. 
  
 Sorry for the inconvenience. 
  
 Thanks, 
 Howard

Hi Howard,



I have huge and very complex code. Though I am sending you map related code where I have set some properties. Then adding layers to customlayers. This all happens once at page load event of web page. For easy accessibility in code behind I have created region start and end tag. 



Find attached page_load code in text file along with .gif file that shows web page in IE browser.



Thanks

Hiren



1261-Map_code.txt (127 KB)
1262-Web_Page_view.GIF (76.9 KB)

Hiren, 
  
 What a huge method! Let’s confirm something so that we are in the same line. Please point out the misunderstanding in my following list: 
  
 1, you have two overlay; one maintains actual layers while another one maintains labels. 
 2, the overlay which maintains layers is multi-tile. 
 3, the overlay which maintains labels is single-tile. 
 4, the projection is converted to Google’s projection. 
 5, after panning the map, the label disappear. 
  
 Looking forward you feedback. 
  
 Thanks, 
 Howard

Howard,



1. I have only one overlay that has all the layers (Actual, label & Bing)

2. This overlay is single-tile

3. Yes it's google projection

4. No label does not disappear. but it does not show on the map after panning. Infact for all the lines.  The lable should be there for that line when ever user panning. 



Thanks

Hiren



 



Hiren, 
  
 Now I know the 1, 2, 3 items; but I still have some issue about the 4th item.  
  
 1) Does the label and actual layer maintain the same ShapeFile?  
 2) Does the label only disappear after panning and cannot display again even if you continuous panning for several times? 
 3) If the label and actual layer maintain the same ShapeFile, does the actual layer disappear after panning? 
  
 Please provide us these information. 
  
 Thanks, 
 Howard

Howard,



Please find below information.



1. Yes label and acutal layer maintain the same shape file.

2. Label disappear after panning but does display again if I span back to original location. (Since some of lines are big in legnth, so I assume currently label is placed at the center of line. But it's hard to see or know what line type is when we are far away from center line. So I need label to display on every spanning for that line. That's what I meant dynamic labelling on panning.)

3. Acutal layer does not disappear after panning.





Thanks

Hiren



Hiren,


I guess the problem is the setting of the labeling; please refer to the following post to see if it helps.

gis.thinkgeo.com/Support/Dis...#7097#7097


Please let me know if you have more questions.


Thanks,

Howard














Howard,


 


Thanks for quick reply.


That post link did not help. In fact it's totally reverse then what I have. They talks about small street level line data, where labels are not displaying if length of label is big then street length.


 


While in my case, I always have big length street but label display only once (center) of line. I want label to repeat and display for that line, every time when I spanning that line.


It's hard to see or know what line type is when we are far away from center line.


 


Please find attached screen shot.



        
  1. Label      name with line

  2.     
  3. No      Label name with line (When I span right hand side)


 


Thanks


Hiren



1272-Label_name_with_line.GIF (86.1 KB)
1273-No_Label_name_with_line.GIF (82.5 KB)









Adding to previous post.


In attached ‘Label name with line.gif’ you can see MCI METRO – 72F as label for blue line.


 


When I span on right, MCI METRO – 72F label is not shown for that blue line (No Label name with line.gif) .


 


Thanks


Hiren




Hiren, 
  
 It’s better if you send us a simple sample to recreate your issue. 
  
 Currently, we can only guess the reason for your situation; at first I guess it’s the projection issue, but the line displays correctly while the label doesn’t; then I guess the cache but you are using the single tile type. At last I guess the label settings; but you said it’s not your case.  
  
 So if you separate the issue to a simple sample which only loads the line and label which doesn’t spend you much time; we think we can find the issue immediately. 
  
 Thanks, 
 Howard









Howard,


 


Please find attached sample that loads the line and label from same shape files.


Line layers displays from (1-15)


Label layers displays from (16-20)


 


I have forwarded shape data file (Burried_Cable.zip) to support people.


 


Thanks


Hiren




1285-DynamicLabelling.zip (2.42 KB)

Hi Hiren,


We want to make sure if we have recreated your problem:
At first, we can see that the label has shown on the map, the blue line is a feature from the shape file you sent to us, and the red text is a label, you can take a look at the screenshot:
 
Then, we pan the map right along the line shape, and the label disappears like the screenshot:
 
At last, we continue to pan the map right, and another label shows on the map again:
 
So what you want is to make the label always show on the screen as long as the line shape is on the screen, is that right?
Any more information please let me know.
Thanks,
sun

Maybe setting some other properties of TextStyle satisfies your requirement; please have a try by adding these lines of code: 




textStyle.TextLineSegmentRatio = double.MaxValue;
textStyle.FittingLineInScreen = true;


 
Any more questions please let me know.
 
Thanks,
 
sun

Hi Sun,



You are absolutely right.

I want to make label always show on the screen as long as line shape is on the screen. My users mostly do spanning and they want to see label all time.


How do I acheive this?



Thanks

Hiren



Hiren,


If so, have you tried to set these two properties of the TextStyle:


textStyle.TextLineSegmentRatio = double.MaxValue;
textStyle.FittingLineInScreen = true;


Any more information please let me know.
Thanks,
Sun 

 



Hi Sun,



I think it works.

My user will try for couple of days. Will let you know if there is any issue



Thanks

Hiren



OK, that sounds good. 
  
 Any more questions please let me know. 
  
 Thanks, 
  
 Sun