ThinkGeo.com    |     Documentation    |     Premium Support

How to customize TrackOverlay


Hi all,


I need to add custom style in to TrackOverlay.TrackShapeLayer. But when I add it in to  CustomStyles collection I get a run time error

which says I can't use custom style and default style both. But I'm sure I only use Custom style.


This is how I add custom style in to TrackOverlay. My requirement is to add some labels when i mark points on the map


_winformsMap.TrackOverlay.TrackShapeLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(nameTextStyle);


I would really appreciate if someone can suggest me a solution.


Thanks


Amila



Amila


Thanks for your post and welcome you to ThinkGeo desktop discussion forum.


Why not use the default text style instead? We cannot use the default text style and customized sty at the same time.



_winformsMap.TrackOverlay.TrackShapeLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = nameTextStyle;

Any questions please feel free to let me know.


Thanks.


Yale


 



Hi yale, 
  
 Thanks for your reply.  Yes by set DefaultTextStyle i was able to set my custom style into TrackShapeLayer and i set column like below. 
  
 GeoFont font = new GeoFont(“Arial”, 8); 
 GeoSolidBrush brush = new GeoSolidBrush(GeoColor.SimpleColors.Black); 
  
 TextStyle nameTextStyle = new TextStyle(“NAME”, font, brush); 
  
 FeatureSourceColumn labelColumn = new FeatureSourceColumn(“NAME”, “string”, 10); 
  
  _winformsMap.TrackOverlay.TrackShapeLayer.Open(); 
  _winformsMap.TrackOverlay.TrackShapeLayer.Columns.Add(labelColumn); 
  _winformsMap.TrackOverlay.TrackShapeLayer.Close(); 
  
  
 _winformsMap.TrackOverlay.TrackShapeLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = nameTextStyle; 
  
  
  
 But then I click into map to mark points I’m getting a exception which says “The given key was not present in the dictionary”.  
  
 Would you please be kind enough to give me instruction on how to set a column and TextStyle to mark some text near point using  _winformsMap.TrackOverlay. 
  
 I was able to make this work using a new InMemoryFeatureLayer as InMemoryFeatureLayer  _pointLayer = new InMemoryFeatureLayer(columns, new Feature[] { }); 
 I’m not sure why i need to add Feature[] into constuctior.But onthe other side i need to use only _winformsMap.TrackOverlay.TrackShapeLayer for this application. So I can’t use a new InMemoryFeatureLayer. 
  
 Thanks 
 Amila 
  


Amila,


I follow your code and test on our HowDoI sample, it works properly, please look at my code and screen-shot


        private void TrackAndEditShapes_Load(object sender, EventArgs e)
        {
            _winformsMap.MapUnit = GeographyUnit.DecimalDegree;
            _winformsMap.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);

            _winformsMap.CurrentExtent = new RectangleShape(-139.2, 92.4, 120.9, -93.2);

            GeoFont font = new GeoFont("Arial", 8);
            GeoSolidBrush brush = new GeoSolidBrush(GeoColor.SimpleColors.Black);

            TextStyle nameTextStyle = new TextStyle("NAME", font, brush);

            FeatureSourceColumn labelColumn = new FeatureSourceColumn("NAME", "string", 10);

            _winformsMap.TrackOverlay.TrackShapeLayer.Open();
            _winformsMap.TrackOverlay.TrackShapeLayer.Columns.Add(labelColumn);
            _winformsMap.TrackOverlay.TrackShapeLayer.Close();
            _winformsMap.TrackOverlay.TrackShapeLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = nameTextStyle;
            _winformsMap.TrackOverlay.TrackEnded += new EventHandler<TrackEndedTrackInteractiveOverlayEventArgs>(TrackOverlay_TrackEnded);

            _winformsMap.Refresh();
        }

        void TrackOverlay_TrackEnded(object sender, TrackEndedTrackInteractiveOverlayEventArgs e)
        {
            int lastIndex = _winformsMap.TrackOverlay.TrackShapeLayer.InternalFeatures.Count-1;
            _winformsMap.TrackOverlay.TrackShapeLayer.InternalFeatures[lastIndex].ColumnValues.Add("NAME", Guid.NewGuid().ToString());
        }


Thanks


James




Hi James,



Thanks for your reply and I tested this as you said. It’s working fine when drawing a point. But it throws same exception ("The given key was not present in the dictionary.") when I try to draw any other shape. I can’t see guid printed for others shapes as screenshot provided by you.



What is the reason for this? My thinkGeo version is 3.0.0.0.  and have attached my TrackAndEditShapes.cs file for your reference.



Thank you very much

Amila



Amila,


Thanks for your post and feedback.
 
I am sorry to say that I could not download the .cs file you provided, so I cannot recreate the problem you mentioned, could you uploaded it again if you want? While when I tested the code provided by James, it works perfectly. I attached the whole .cs file, hope it helps. Also, is it possible that you take a try against our latest public release on Nov 1st?
 
Any more questions please do not hesitate to let me know.
 
Thanks.
 
Yale

TrackAndEditShapes.zip (2.47 KB)

Hi Yale,



I downloaded version 4.5 and its working fine with that version. So that I can assume It should be a bug of version 3. But in new version I can’t see guid printed for lines but it print for all other symbols. But its better it doesn’t give any exceptions. 



But my next step is to print text with lines also :(  Any idea for that? 



I should heartfelt thanks goes to both of you.



Thanks

Amila






hi,


See the screen shot below. It print guid only in some lines. not all. Code is same old code. can you imgine the reason?




Amila,


Thanks for your post and screenshots showing the problems.
 
Try following code snippet, please notice the differences to set the nameTextStyle, hope it works.
 

private void TrackAndEditShapes_Load(object sender, EventArgs e)
{
     _winformsMap.MapUnit = GeographyUnit.DecimalDegree;
     _winformsMap.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);
 
     _winformsMap.CurrentExtent = new RectangleShape(-139.2, 92.4, 120.9, -93.2);
 
     GeoFont font = new GeoFont("Arial", 8);
     GeoSolidBrush brush = new GeoSolidBrush(GeoColor.SimpleColors.Black);
 
      TextStyle nameTextStyle = new TextStyle("NAME", font, brush);
 
      FeatureSourceColumn labelColumn = new FeatureSourceColumn("NAME", "string", 10);
 
      _winformsMap.TrackOverlay.TrackShapeLayer.Open();
      _winformsMap.TrackOverlay.TrackShapeLayer.Columns.Add(labelColumn);
      _winformsMap.TrackOverlay.TrackShapeLayer.Close();
 
      nameTextStyle.OverlappingRule = LabelOverlappingRule.AllowOverlapping;
      nameTextStyle.TextLineSegmentRatio = 10;
            _winformsMap.TrackOverlay.TrackShapeLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = nameTextStyle;
      _winformsMap.TrackOverlay.TrackEnded += new EventHandler<TrackEndedTrackInteractiveOverlayEventArgs>(TrackOverlay_TrackEnded);
 
       _winformsMap.Refresh();
 
}

 
Any more questions please do not hesitate to let me know.
 
Thanks.
 
Yale

Thanks James, Yale. Help from both of you is really appreciated. I was able to find the solution from your guides. Thank again

Amila, 
  
 You’re so welcome, just feel free to ask more questions when you want to us help. 
  
 James