ThinkGeo.com    |     Documentation    |     Premium Support

Square markers with background and font colors?

Hi community, hope you’re all doing well.



I’m migrating an application that was using DUNDAS to ThinkGEO. So far, so good.



But right now I’m at a dead-end. See the attached image at the bottom of the post.



I need to be able to insert for each region (a region is a country / province / something) what we define as a CUMULATIVE FACTOR. The user will enter values for different cumulative factors for each region, and we need to display it as a SQUARE with a background color and a font color (each factor has it’s own back color and font color). Each region can have 0…* cumulative factors. So, in the image below, we can see that “North-Western” has 3 cumulative factors, with values 22, 14 and 32.



DUNDAS provided the ability to accomplish this by using Symbols. Those symbols had a text, background color, position, and such.



Can you please lead me in the right direction to accomplish this in ThinkGEO?



Code and images are below.



Thanks!



Juan.


Symbol s2 = new Symbol();
s2.MarkerStyle = MarkerStyle.Rectangle;
 
s2.HatchStyle = MapHatchStyle.DarkVertical;
s2.X = s.CentralPoint.X;
s2.Y = s.CentralPoint.Y;
s2.TextAlignment = TextAlignment.Center;
s2.TextShadowOffset = 2;
//s2.Offset = new Offset() { Y = -40 };
s2.Text = sum.ToString("##");
if (f.Color.Split(’,’).Length > 1)
{
    s2.TextColor = ColorTranslator.FromHtml(f.Color.Split(’,’)[1]);
    s2.Color = ColorTranslator.FromHtml(f.Color.Split(’,’)[0]);
    s2.SecondaryColor = ColorTranslator.FromHtml(f.Color.Split(’,’)[0]);
}
else
{
    s2.TextColor = SystemColors.ControlText;// ColorTranslator.FromHtml(f.Color.Split(’,’)[0]);
    s2.Color = SystemColors.Control; //ColorTranslator.FromHtml(f.Color.Split(’,’).Length > 1 ? f.Color.Split(’,’)[1] : “#000000”);    
}
s2.Layer = “CumulativeFactor”;
s2.ParentShape = s.Name;
s2.Height = (int)(30 - (30 * (tbMarkerSize.Value - 5) * 5 / 100));
s2.Width = (int)(30 - (30 * (tbMarkerSize.Value - 5) * 5 / 100));
s2.Font = new Font(“Trebuchet MS”, (tbMarkerSize.Value > 12 ? 8 : tbMarkerSize.Value > 10 ? 9 : tbMarkerSize.Value > 8 ? 10 : tbMarkerSize.Value > 6 ? 11 : 12), FontStyle.Bold);
s2.Tag = imf;
mapControl1.Symbols.Add(s2);







Hi Juan, 
  
 I have a question here, it looks your code contains an object named Symbol. I am not sure whether it looks like our label which need be drawn above corresponding polygon shape or it looks like our marker which need specified coordinate. 
  
 If it’s looks like marker (Need be specified coordinate) and the possible color combinations is not too many, you can choose to use marker implement it (background with image and text draw on it). 
  
 If it’s looks like label (Which don’t need set location, only draw above based shape), you should want to implement a custom feature layer for it, this way is more complex, we can help you on this if you have any question. 
  
 Regards, 
  
 Don

Hi Don, 
  
 I would think it looks more like a label than a Marker. The user does not specify a location for it, they just assign values to regions (countries, provinces, and so) and then we display those values in each region that has a value. 
  
 Anyway, if there’s a way with Markers to make it look similar to this, and you think it would be easier, then that’s ok. But the user won’t specify the location. I can map the “region” to a shapefile and a feature within it, so I guess that’s helpful if we need to get the location, right? 
  
 Thoughts?

Hi Juan, 
  
 I thought that again today, it looks if we put that like marker, we need to ready many images as background image, because it looks your images sometimes is 3 parts and sometime is 1 part, I thought maybe there is two parts image also. So that’s a problem. 
  
 So the solution should still be override text style, then read your information which will be saved in column values of feature, and draw label by the API of GeoCanvas. I think it’s also not be an easy work to make the the image looks your image before. 
  
 Regards, 
  
 Don 
  


Well, I was actually thinking about implementing it with MARKERS today. If you look at it, it’s always ONE image (a square with a text in some color). But a region, lets say FLORIDA state in the US, might have 3 images. So, my idea was to create square markers with a Label on top, and if a region has more than 1, then set the position for each marker to a point within the region. 
  
 If you still think this is a bad idea, please let me know. And if you can, please provide an example of what you’re saying I should do. 
  
 Thanks again! 
  
 Juan.

Hi Juan, 
  
 The problem is if you set one marker for one square, then when you have 3 squares, you have to adjust it’s position each zoomlevel because when you zoom in/out, the spacing will change so it will looks different. 
  
 If you want to implement like marker, do you think you can draw enough background image include all possible combinations, include one square and three squares? If you think that’s possible (Because I don’t know your detail scenario and there are how many types combinations), you can try to go follow this way. 
  
 But I think a better way is override text style like this: 
  
  
  protected override void DrawCore(System.Collections.Generic.IEnumerable<Feature> features, GeoCanvas canvas, System.Collections.ObjectModel.Collection<SimpleCandidate> labelsInThisLayer, System.Collections.ObjectModel.Collection<SimpleCandidate> labelsInAllLayers) 
         { 
             foreach (Feature feature in features) 
             { 
                 PointShape labelPosition = feature.GetBoundingBox().GetCenterPoint(); 
                 string labelText = feature.ColumnValues[“yoursavedinformation”]; 
  
                 canvas.DrawArea  // Draw border 
                 canvas.DrawText // Draw label 
             } 
         } 
  
 But just like my code shows, implement it is well is not easy. 
  
 Regards, 
  
 Don