ThinkGeo.com    |     Documentation    |     Premium Support

ClassBreak Style on shape file with multiple columns and external data

I have a shape file that has two columns in the dbf file.  A and B


I would like to create a class break style that combines data from both columns in the shapefile with some external data.


The logic would be as follow:


if Column A = 1 then

   return (Column B x P) -  E1

else if Column A = 2 then

   return (Column B x P) - E2


Where P, E1 and E2 are from data that not contained in the shape file but A and B are.


I tried using CustomerColumnFetch from one of the examples but I couldn't get that to work because I couldn't access the data form the other columns.


Any help would be appreciated.


 


 


 


 


 


 


 


 


 


 


 



Hi Kevin, 
  
 Are your P, E1 and E2 value dynamic when your programe run? 
  
 If not I think you can try to work like this: 
  
 When map load, build a column C  and calculate the value of it follow your logc. 
  
 Then directly make classbreak work with column C. 
  
 Do you think that will works for you? 
  
 Regards, 
  
 Don

Those values (P, E1 and E2) are dynamic and will be coming from a database. 


So I would have to reset coloumn C, every time the map was refreshed.


Do you have a sample you can point me to on how and when to calculate the value for the the new column.  Would this method actually modify the shp file, or just change the version stored in memory?


Thanks



Hi Kevin, 
  
 Sorry I think use ClassBreak Style cannot implement that. 
  
 And I suggest you ValueStyle instead that. 
  
 I want to share my thinking about it to you, maybe that’s not the best solution but I think that will works for your requirement. 
  
 And could you let me know where the CustomerColumnFetch sample is? I want to have a look at that for make sure whether we can have a better solution. 
  
 Regards, 
  
 Don

As below is my steps for that:  
  
 1. Build an InMemoryFeatureLayer and import all features from your ShapeFileFeatureLayer to it. Don’t forget add your Column A and Column B value to the InMemoryFeatureLayer. Create column C for each feature. 
  
  
  ShapeFileFeatureLayer shapeFileFeatureLayer = new ShapeFileFeatureLayer(“SHP_PATH”);
                InMemoryFeatureLayer layer = new InMemoryFeatureLayer();
                layer.Open();
                layer.Columns.Add(new FeatureSourceColumn(“A”));
                layer.Columns.Add(new FeatureSourceColumn(“B”));
                layer.Close();

                foreach (Feature feature in shapeFileFeatureLayer.FeatureSource.GetAllFeatures(ReturningColumnsType.AllColumns))
                {
                    feature.ColumnValues.Add(“C”, “1”);
                    layer.InternalFeatures.Add(feature);
                }


2. Create ValueStyle and add to our layer 
  
 
ValueStyle valueStyle = new ValueStyle();
                valueStyle.ColumnName = "C";
                valueStyle.ValueItems.Add(new ValueItem("1", PointStyles.Capital1));
                valueStyle.ValueItems.Add(new ValueItem("2", PointStyles.City1));

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


3. When you need calculate the value again, reset the column C. Here I just set you change that when extent change. 
  
 

protected void Map1_ExtentChanged(object sender, ExtentChangedEventArgs e)
        {
            InMemoryFeatureLayer layer = Map1.StaticOverlay.Layers[0] as InMemoryFeatureLayer;
            foreach (Feature feature in layer.InternalFeatures)
            {
                int P;
                int E1;
                int E2;
                int newValue;
                if (feature.ColumnValues["A"] == "1")
                {
                    newValue = (Int32.Parse(feature.ColumnValues["B"]) * P) - E1;
                }
                else if (feature.ColumnValues["A"] == "2")
                {
                    newValue = (Int32.Parse(feature.ColumnValues["B"]) * P) - E2;
                }

                if (newValue < 15)
                {
                    feature.ColumnValues["C"] = "1";
                }
                if (newValue < 30)
                {
                    feature.ColumnValues["C"] = "2";
                }
                //…etc.
            }
        }



Kevin, 
  
 Wish that works for you. 
  
 Regards, 
  
 Don