ThinkGeo.com    |     Documentation    |     Premium Support

Does ValueStyle support number columns?

Hi,


I am adding CustomeStyles with ValueStyle, code as below:


            ValueStyle valueStyle = new ValueStyle();

            valueStyle.ColumnName = column;

            valueStyle.ValueItems.Add(new ValueItem("0", PointStyles.CreateSimpleTriangleStyle(GeoColor.StandardColors.LightYellow, 12, GeoColor.StandardColors.Black)));

            valueStyle.ValueItems.Add(new ValueItem("1", PointStyles.CreateSimpleTriangleStyle(GeoColor.StandardColors.Yellow, 12, GeoColor.StandardColors.Black)));

            valueStyle.ValueItems.Add(new ValueItem("2", PointStyles.CreateSimpleTriangleStyle(GeoColor.StandardColors.Orange, 12, GeoColor.StandardColors.Black)));

 


It only works on string columns but not working on number columns. If I specify number columns, nothing is shown on the map.


Does it support number columns, if it does, what did I do wrong?


Thanks



Hi, Ching 
  
 Yes, it does support number columns for ValueStyle. I have tested it with SQL Server 2008 and Shape Files data source and all work well. 
 Could you please provide us with some more information? Such as which data source you are consuming or provide us with a simple sample to recreate it? 
 If you are using MsSql2008FeatureLayer, please set the right SRID when you import your data into Sql Server 2008. 
  
 Thanks, 
 Khalil

Ok, sample code below, it won't compile but should give you some idea what is going on:



 


If I set columnName to a column that has string values and modify the values in ValueItems to match those values, the map will show features. If I set columnName to a column is of number type, and modify the ValueItems to numbers to match the values in the shape file, nothing is shown on the map. The data is in a .dbf file which is located in the same folder shape file located.


Thanks



 private void InitializeMap()

 {

            CurrentMap.MapUnit = GeographyUnit.Meter;


            CurrentMap.MapTools.MouseCoordinate.Enabled = true;


     CurrentMap.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.DeepOcean);


            CurrentMap.CustomOverlays.Add(GetShapeOverlay());

            SetMapFullExtent();


 }


 private LayerOverlay GetShapeOverlay()

 {

         ShapeFileFeatureLayer ShapeLayer = GetCrashLocationShapeLayer();

         Proj4Projection proj4 = new Proj4Projection();

         proj4.InternalProjectionParametersString = Config.Current.InternalProjectionParametersString;

         proj4.ExternalProjectionParametersString = Proj4Projection.GetGoogleMapParametersString();

         ShapeLayer.FeatureSource.Projection = proj4;


            LayerOverlay shapeOverlay = new LayerOverlay(ShapeFileLayerOverlayName, false, TileType.SingleTile);

         shapeOverlay.Layers.Add(ShapeLayer);

         shapeOverlay.TransitionEffect = TransitionEffect.None;

         return shapeOverlay;

 }


        private ShapeFileFeatureLayer GetCrashLocationShapeLayer()

        {

            string columnName = "NumberOfLa";

            ShapeFileFeatureLayer shapeLayer = new ShapeFileFeatureLayer(MapPath(Config.Current.CrashLocationShapeFile));

            MapHelper.BuildIndexFile(shapeLayer, MapPath(Config.Current.CrashLocationShapeFile));

            shapeLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(GetValueStyle(columnName));

            shapeLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

            shapeLayer.DrawingQuality = DrawingQuality.Default;

            shapeLayer.DrawingMarginPercentage = 50;  

            return shapeLayer;

        }


        private ValueStyle GetValueStyle(string column)

        {

            ValueStyle valueStyle = new ValueStyle();

            valueStyle.ColumnName = column;

            valueStyle.ValueItems.Add(new ValueItem("0", PointStyles.CreateSimpleTriangleStyle(GeoColor.StandardColors.LightYellow, 12, GeoColor.StandardColors.Black)));

            valueStyle.ValueItems.Add(new ValueItem("1", PointStyles.CreateSimpleTriangleStyle(GeoColor.StandardColors.Yellow, 12, GeoColor.StandardColors.Black)));

            valueStyle.ValueItems.Add(new ValueItem("2", PointStyles.CreateSimpleTriangleStyle(GeoColor.StandardColors.Orange, 12, GeoColor.StandardColors.Black)));

            valueStyle.ValueItems.Add(new ValueItem("3", PointStyles.CreateSimpleTriangleStyle(GeoColor.StandardColors.OrangeRed, 12, GeoColor.StandardColors.Black)));

            valueStyle.ValueItems.Add(new ValueItem("4", PointStyles.CreateSimpleTriangleStyle(GeoColor.StandardColors.Red, 12, GeoColor.StandardColors.Black)));

            valueStyle.ValueItems.Add(new ValueItem("5", PointStyles.CreateSimpleTriangleStyle(GeoColor.StandardColors.Blue, 12, GeoColor.StandardColors.Black)));

            valueStyle.ValueItems.Add(new ValueItem("6", PointStyles.CreateSimpleTriangleStyle(GeoColor.StandardColors.Purple, 12, GeoColor.StandardColors.Black)));

            return valueStyle;

        }

 



I guess the better question would be, should I do anything different if it was a number column vesus a string column? 
 Because it is working for any string column and not working for any number column.

Ching, 
  
 The column value will be converted to string if you specify a number column, so there will be no changes you need to do. Could you call the GetAllFeatures with the specified number column to get all features and check if there is any differences between the value you set in ValueItem and the feature’s attribute? I’m just wondering if there is any special CutureInfo with your PC. Could you have a check and let us know? 
  
 Thanks. 
  
 Johnny   


Ok, I am able to get it working by using ClassBreakStyle which allow me to pass in double instead of string. 
 And I also call the GetAllFeatures to get the values, it’s returning 0.00000000e003 for a value 0. 
 I also remember I need to convert an integer column to double first then int, otherwise it will fail. 
 I really like to use ValueStyle which will take care of both number column and string column, how do I work around this? 
  
 Thanks

 


Ching,
 
Just from your description, the number column should be with Double type instead of int, right? The best solution is that we can develop another customValueStyle inherited from ValueStyle and just need to overwrite “DrawCore”. Here is the code, please have a try:
 


public class CustomValueStyle : ValueStyle
    {
        protected override void DrawCore(System.Collections.Generic.IEnumerable<Feature> features, GeoCanvas canvas, Collection<SimpleCandidate> labelsInThisLayer, Collection<SimpleCandidate> labelsInAllLayers)
        {
            foreach (Feature feature in features)
            {
                string fieldValue = feature.ColumnValues[ColumnName].Trim();
                ValueItem valueItem = GetValueItem(fieldValue);

                Feature[] tmpFeatures = new Feature[1] { feature };
                if (valueItem.CustomStyles.Count == 0)
                {
                    valueItem.DefaultAreaStyle.Draw(tmpFeatures, canvas, labelsInThisLayer, labelsInAllLayers);
                    valueItem.DefaultLineStyle.Draw(tmpFeatures, canvas, labelsInThisLayer, labelsInAllLayers);
                    valueItem.DefaultPointStyle.Draw(tmpFeatures, canvas, labelsInThisLayer, labelsInAllLayers);
                    valueItem.DefaultTextStyle.Draw(tmpFeatures, canvas, labelsInThisLayer, labelsInAllLayers);
                }
                else
                {
                    foreach (Style style in valueItem.CustomStyles)
                    {
                        style.Draw(tmpFeatures, canvas, labelsInThisLayer, labelsInAllLayers);
                    }
                }
            }
        }

        private ValueItem GetValueItem(string columnValue)
        {
            ValueItem result = new ValueItem();

            foreach (ValueItem valueItem in ValueItems)
            {
                // Todo: Please modify this comparation line based on your own scenaroes.
                if (string.Compare(columnValue, valueItem.Value, StringComparison.OrdinalIgnoreCase) == 0)
                {
                    result = valueItem;
                    break;
                }
            }

            return result;
        }
    }



 
NOTE: There is a ToDo in the code, which used to check if the input value is equal to the feature column value. Please modify it based on your scenario.
 
Thanks,
 
Johnny

I modified GetValueItem function, it’s working now, thanks.

That’s great! Any questions please let us know. 
  
 Johnny