ThinkGeo.com    |     Documentation    |     Premium Support

CustomColumnFetch event handler

Hi Everybody


I have one problem with CustomColumnFetch event handler. It does not fire at all when the shape file is fetched. I tried to put a break point to the map suite sample code as well as mine and non of them it is firing. 



Another problem I am having, is plugin and WMS service of my own I have created following instruction from Map suite's quick start guide. When I connect to my service from a desktop application it compiles well but insteady of displaying a map it displays watermarks saying 'WMS Server Exception see Server Trace'. I have just failed to establish where things go wrong as everything is compiling successifully. 



Could you please help me here? 



Best Regards, 

Vincent

Hi, Vincent


That’s weird. You mean the “AddMyOwnCustomDataToAFeatureLayer” installed sample can’t run well? Can you see the result which shows the same as attached screenshot? If you still have problem, please send us your codes, and if it’s so big, please send it to forumsupport@thinkgeo.com and ask him to forward me.
Please first off give a try for our installed sample, if it runs well, and here are some things you need to check out. Whether you have start up the server firstly? Whether you have set the right server URL? You can set the DrawingExceptionMode of TiledWmsLayer as DrawException to see what happens, and the exception message will be drawn on the return images. Also you can use Debug view tool to see the exception message of server-side.
If you can provide us the exception stack trace and so that we can fixed it quickly. If you have any questions please let us know.
Thanks,
Khalil

AddMyOwnCustomDataToAFeatureLayer.zip (121 KB)

Hi Khalil


Thank you very much for your help.


I have sent you my code via forumsupport@thinkgeo.com and asked them to forward it to you.


Best regards,


Vincent



Hi, Vincent 
  
 I have got your sent email, but the attached file has been filtered by my outlook, and it seems that it contains virus. Please be sure of its security and then send it again. 
  
 Thanks, 
 Khalil

Hi Khalil


I have scanned it with latest and updated Kaspersky antvirus. Also I have noticed that Gmail has successfully scanned it as well.


So I have sent it again.


Thanks


Vincent



Vincent, 
  
 Sorry for that, I also don’t get your email. Maybe your email address has been blocked by Outlook. Anyway, please send it to support@thinkgeo.com and ask him forward me. Sorry for the inconvence caused to you. 
  
 Thanks, 
  
 Khalil

Hi Khalil


I have sent you another email through support@thinkgeo.com


Best Regards,


Vincent



Hi Khalil


If you still can't get the attachment, can you use the code below to help me with my problem. The event handle 'worldLayer.FeatureSource.CustomColumnFetch'  does not respond to the fetched column. I have marked the parts which are not working with yellow color.


 



 


public class DisplayASimpleMapWmsLayerPlugin : WmsLayerPlugin

{


 


// This method is only called once per style and crs. In it you should create your

 


// layers and add them to the MapConfiguration. If you want to use tile caching you

 


// can also specif that in the MapConfiguration under the TileCache property.

 


// If you have setup multiple styles or projections this method will get called for

 


// each unique combination

 


//ShapeFileFeatureLayer worldLayer;

 


{


 


 


protected override MapConfiguration GetMapConfigurationCore(string style, string crs)// Get the directory to the sample data

 


 


string worldLayerFilePath = Directory.GetParent(Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory).FullName).FullName + "\\SampleData\\Countries02.shp";// Create the world layer from a shapefile and add a style to it

 


 


worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle =


worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel =


 


  

 


ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(worldLayerFilePath);AreaStyles.Country1;ApplyUntilZoomLevel.Level20;worldLayer.FeatureSource.CustomColumnFetch += new EventHandler<CustomColumnFetchEventArgs>(FeatureSource_CustomColumnFetch);  // Create a MapConfiguration and add the layer to it

 


mapConfiguration.Layers.Add(


 


}


 


{


 


{


 


 


e.ColumnValue =


}


}


 


MapConfiguration mapConfiguration = new MapConfiguration(); "WorldLayer", worldLayer);return mapConfiguration;void FeatureSource_CustomColumnFetch(object sender, CustomColumnFetchEventArgs e)if (e.ColumnName == "CNTRY_NAME")string id = e.Id;string columnName = e.ColumnName;"My Country";// In this method you need to return the name of the Layer that WMS will expose.

 


// You will use this name on the client to specify the layer you want to consume

 


{


 


}


 


protected override string GetNameCore()return "Display A Simple Map";// In this method you need to return the projections that are supported by your data.

 


// It is your responsability to project the data in the MapConfiguration for each projection

 


// type you specify here.

 


{


 


}


 


protected override Collection<string> GetProjectionsCore()return new Collection<string> { "EPSG:4326" };// In this method you need to return the bounding box of the layer.

 


{


 


}


}


protected override RectangleShape GetBoundingBoxCore(string crs)return new RectangleShape(-126.826171875, 57.104766845702, -70.83984375, 18.960235595702);



Hi, Vincent


For your first problem about “The CustomColumnFetch event handler does not fire”, and I think it’s caused by that you don’t add DefaltTextStyle to ZoomLevel, and we can’t find the custom column name so that the event handler is ignored.  Adding the text style likes the code below:
worldLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = TextStyles.Capital1("Test");
“Test” is the custom column name and you can change it to another name and it’s used to add custom data to the feature layer.  Also you can add other custom column names:
worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.RequiredColumnNames.Add("Test");
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.
By default, the exception message will be written to the Trace, if it says “WMS Server Exception See Server Trace” that means you need to get the exception message through the DebugView or other deug tools.
If you have got that exception message, please let us know so that we can figure out why it occurs.
If you have additional questions, please let us know.
Thanks,
Khalil

Hi Khalil


Thank you very much for your reply.


It has worked. But if I have multiple Shapefile Feature Layers loaded, the event does not fire. In the code below, the event does not fire.


 



 



protected override MapConfiguration GetMapConfigurationCore(string style, string crs)// Get the paths to the sample data

 


 


 


 



 


string path = Directory.GetParent(Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory).FullName).FullName;string worldLayerFilePath = path + "\\SampleData\\Countries02.shp";string stateFilePath = path + "\\SampleData\\STATES.SHP";string citiesFilePath = path + "\\SampleData\\cities_a.shp";// Setup the various shape file layers

 


 


worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle =


worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel =



 


 


 


ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(worldLayerFilePath);AreaStyles.Country1;ApplyUntilZoomLevel.Level20;ShapeFileFeatureLayer statesLayer = new ShapeFileFeatureLayer(stateFilePath);//statesLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = TextStyles.Capital1("Test");

statesLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle =


statesLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle =


statesLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel =


 


statesLayer.FeatureSource.CustomColumnFetch +=


 


citiesLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle =


citiesLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle =


citiesLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle.HaloPen =


citiesLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel =


citiesLayer.DrawingMarginPercentage = 50;


 


 


TextStyles.Country1("STATE_NAME");AreaStyles.CreateSimpleAreaStyle(GeoColor.FromArgb(255, 243, 239, 228), GeoColor.FromArgb(255, 218, 193, 163), 1);ApplyUntilZoomLevel.Level20;new EventHandler<CustomColumnFetchEventArgs>(FeatureSource_CustomColumnFetch);ShapeFileFeatureLayer citiesLayer = new ShapeFileFeatureLayer(citiesFilePath);PointStyles.City3;new TextStyle("AREANAME", new GeoFont("Verdana", 9), new GeoSolidBrush(GeoColor.StandardColors.Black));new GeoPen(GeoColor.StandardColors.White, 2);ApplyUntilZoomLevel.Level20;// Create a MapConfiguration and add the layer to it

 


mapConfiguration.Layers.Add(


mapConfiguration.Layers.Add(


mapConfiguration.Layers.Add(


 


}



 


{


 


{


 


 


e.ColumnValue =


}


}


MapConfiguration mapConfiguration = new MapConfiguration();"WorldLayer", worldLayer);"StatesLayer", statesLayer);"CitiesLayer", citiesLayer);return mapConfiguration;void FeatureSource_CustomColumnFetch(object sender, CustomColumnFetchEventArgs e)if (e.ColumnName == "CNTRY_NAME")string id = e.Id;string columnName = e.ColumnName;"My Country";

Best Regards,


Vincent



{


 



Hi, Vincent


I can’t see your codes clearly. Can you package it up into text file or other flat files and attach it in this post?
Thanks,
Khalil

Hi Khalil


I have attached a text file with the code.


Best Regards,


Vincent



EventFire.txt (6.47 KB)

Hi, Vincent


I think you have some misunderstanding for this event handler.
 
This event is raised when fields are requested in a feature source method that does not exist in the feature source. It allows you to supplement the data from any outside source you have. It is used primarily when you have data relating to a particular feature or set of features that is not within source of the data. For example, you may have a shape file of the world whose .dbf component describes the area and population of each country. Additionally, in an outside SQL Server table, you may also have data about the countries, and it is this data that you wish to use for determining how you want to color each country. To integrate this SQL data, you simply create a filed name that does not exist in the .dbf file. Whenever Map Suite is queried to return records that specifically require this field, the FeatureSource will raise this event and allow the developer to supply the data. In this way, you can query the SQL table and store the data in some sort of collection, and then when the event is raised, simply supply that Data. As this is an event, it will raise for each feature and field combination requested.
This means that the event can be raised quite often, and we suggest that you cache the data you wish to supply in memory. We recommend against sending out a new SQL query each time this event is raised. Image that you are supplementing two columns and your query returns 2,000 rows. This means that if you requested those fields, the event would be raised 4,000 times.
 
I guess your problem is caused by that you use the filed names which exist in the feature source, such as STATE_NAME, AREANAME instead of custom filed name.  I have modified it with custom filed names, so that you can see the scrrenshot below:


 
Thanks,
 
Khalil

ShowUserSpecificMapsWmsLayerPlugin.txt (4.81 KB)

Hi Khalil


Thank you very much. Everything is now working fine.


Best Regards,


Vincent



Hi, Vincent 
  
 Thanks for your feedback.  
  
 If you have any questions, please let us know. 
  
 Thanks, 
  
 Khalil