ThinkGeo.com    |     Documentation    |     Premium Support

CustomColumnFetch event

Hello,


 I found following in the Web Edition sample code for "Using Custom Data".


 



void FeatureSource_CustomColumnFetch(object sender, CustomColumnFetchEventArgs e)   
        {   
            if (e.Id == "135" || e.Id == "47")   
            {   
                string columnName = e.ColumnName;   
                e.ColumnValue = "CountryId:" + e.Id;   
            }   
        }   


 There you check e.Id value. Would you please explain me where this e.Id value come from and how do I can use specific column name from my shape file to be filled in this e.Id field? 



 Shwe 



Hello shwe, 
  
 FeatureSource_CustomColumnFetch is the event handler of event CustomColumnFetch, this event is raised when fields are requested in a feature source method that do not exist in the feature source. It allows you to supplement the data from any outside source you have. 
  
 And in the event handler, the ColumnName property of event args is just the custom name you have added and the id property is the feature id. 
  
 You can use e.ColumnName to get your specific column name. 
  
 Regards, 
  
 Gary

Thank you Gary.


 My question is that where did this e.Id value ( feature id) come from?


 Can we assign this feature id value by a column value from shape file?


 e.g. shape file has 'zip', 'latitude', 'longitude' columns, and I want feature id to be set with the values of 'zip' column.


 Can we do that?


Thank you


shwe



Hello shwe, 
  
 Sorry if I misunderstanding something. 
  
 The id property is the feature id of your feature, why do you want to change a unique id? 
  
 And sorry to say, the Id property only have get method, we can’t change it. 
  
 Regards, 
  
 Gary 
  


Thank you Gary.


I think from the event handler for CustomColumnFetch, you guys might have a way to identify which row of shape file a feature is from.


e.g. I have 100 zip codes in my shape file and from the event handler for CustomColumnFetch, I need to be able to identify which row (zip code) of shape file this particular feature ( CustomColumnFetchEventArgs e ) represents. I mean I need to know zip code.


Can you please suggest?


shwe


 



Hello shwe, 
  
 Yes, we have the RequiredColumnNames can help you. 
  
 Please see the How Do I Samples, the code is worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.RequiredColumnNames.Add("Test"); when the featuresource draws, it will fire the CustomColumnFetch event, then the argument e is the feature which contains feature id, feature column name("test"), and column value with this column name. So you can set worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.RequiredColumnNames.Add("ZipCode"); then when the event fire, you can use e.ColumnValue  to get the zip code. 
  
 Also the RequiredColumnNames is a collection, you can add more column name, every column name will fire the event one time, you can get the column value corresponding the column name. 
  
 Any more questions please feel free to let us know. 
  
 Regards, 
  
 Gary

Thank you Gary.


I might be not very clear in the question.


Here is my source code.


 



  protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                Map1.MapUnit = GeographyUnit.DecimalDegree;
                Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);
                Map1.MapTools.MouseCoordinate.Enabled = true;

                //Zip codes are in "ZCTA5CE10" column in shape file
                ShapeFileFeatureSource.BuildIndexFile(@"C:\temp\WebSites\ThinkGeo\Data\NJ\tl_2010_34_zcta510.shp", @"C:\temp\WebSites\ThinkGeo\Data\NJ\tl_2010_34_zcta510.idx", "ZCTA5CE10", "\\w", BuildIndexMode.DoNotRebuild);
                ShapeFileFeatureLayer stateLayer = new ShapeFileFeatureLayer(@"C:\temp\WebSites\ThinkGeo\Data\NJ\tl_2010_34_zcta510.shp", @"C:\temp\WebSites\ThinkGeo\Data\NJ\tl_2010_34_zcta510.idx");
                stateLayer.Name = "StateLayer";
                stateLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Park1;
                stateLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;//20 is zoomest
                //"SALES_AREA" is custom column
                stateLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = TextStyles.CreateSimpleTextStyle("SALES_AREA", "Arial", 8, DrawingFontStyles.Italic, GeoColor.StandardColors.Black, 3, 3);

                stateLayer.FeatureSource.CustomColumnFetch += new EventHandler<CustomColumnFetchEventArgs>(FeatureSource_CustomColumnFetch);
                stateLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.RequiredColumnNames.Add("SALES_AREA");

                LayerOverlay staticOverlay = new LayerOverlay();
                staticOverlay.IsBaseOverlay = false;
                staticOverlay.Layers.Add(stateLayer);
                Map1.CustomOverlays.Add(staticOverlay);

                //================================
                Map1.CurrentExtent = GetFullExtent(stateLayer);
            }
        }

        void FeatureSource_CustomColumnFetch(object sender, CustomColumnFetchEventArgs e)
        {
            //Form here, all i can know is the e.ColumnName and e.Id.
            //e.ColumnName is alwasys 'SALES_AREA' in this case.
            //In our oracle db, we have SALES_AREA and zip code combination. A sales area might have multiple zip codes.
            //I need to know what is values of zip code ( column name in shp file = "ZCTA5CE10") in this event handler to identify the corresponding SALES_AREA.
            //As far as I know, e.Id is not representing any column from shape file.
            string columnName = e.ColumnName;
            e.ColumnValue = "SALES_AREA0" + e.Id;
        }   

As mentioned in the source code, form event handler, all i can know is the e.ColumnName and e.Id.

e.ColumnName is alwasys 'SALES_AREA' in this case.

In our oracle db, we have SALES_AREA and zip code combination. A sales area might have multiple zip codes.

I need to know what is values of zip code ( column name for zip code in shp file = "ZCTA5CE10") in this event handler to identify the corresponding SALES_AREA.

As far as I know, e.Id is not representing any column from shape file.


Thank you



Shwe,


  I found a way to get the column value of your shapefile in the CustomColumnfetch event. Once you have the zip code value of each feature in the CustomColumnFetch, you can write your code to get the sales area based on our oracle database.


 



void FeatureSource_CustomColumnFetch(object sender, CustomColumnFetchEventArgs e)
{
    ShapeFileFeatureLayer stateLayer = new ShapeFileFeatureLayer(@"C:\temp\WebSites\ThinkGeo\Data\NJ\tl_2010_34_zcta510.shp");

    stateLayer.Open();
    Feature feature = stateLayer.FeatureSource.GetFeatureById(e.Id, ReturningColumnsType.AllColumns);
    stateLayer.Close();

    double zip = Convert.ToDouble(feature.ColumnValues["ZCTA5CE10"]); //Gets the zip code. You might want to change the type based on the type of your column

    //Compare the zip value with the oracle database to find the sales area
    string sales_area = "the sales area"; //Based on your oracle database.
    e.ColumnValue = sales_area;
}   


Thank you Val.


It works.


This is the line it rings the bell.



Feature feature = stateLayer.FeatureSource.GetFeatureById(e.Id, ReturningColumnsType.AllColumns);

 


Thank you


shwe



Shwe,


 I am glad we were able to point you to the right direction. If you have any other questions, let us know.