ThinkGeo.com    |     Documentation    |     Premium Support

Custom column event not getting fired

 Hi,


 


All i want to display is countries filled with some colour and with custom data displaying on top of each country name base on some criteria. I have achieved success in fiiling the country with a colour however the custom column fetch event is not getting fired through which i can add custom data.


Here is the code snippet that is not working fine for me:-


 



using System;


using System.Configuration;


using System.Data;


using System.Linq;


using System.Web;


using System.Web.Security;


using System.Web.UI;


using System.Web.UI.HtmlControls;


using System.Web.UI.WebControls;


using System.Web.UI.WebControls.WebParts;


using System.Xml.Linq;


using ThinkGeo.MapSuite.Core;


using ThinkGeo.MapSuite.WebEdition;


using System.Collections.ObjectModel;


using System.Data.SqlClient;


 



public partial class _Default : System.Web.UI.Page 


{


    protected void Page_Load(object sender, EventArgs e)


    {


        


          Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#E5E3DF"));


          Map1.CurrentExtent = new RectangleShape(-131.22, 55.05, -54.03, 16.91);  


                 Map1.MapUnit = GeographyUnit.DecimalDegree;  


   


                 WorldMapKitWmsWebOverlay worldMapKitOverlay = new WorldMapKitWmsWebOverlay();  


                 Map1.CustomOverlays.Add(worldMapKitOverlay);  


   


                 ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(MapPath("~/World/cntry02.shp"));  


                 AreaStyle areaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.SimpleColors.Transparent, GeoColor.FromArgb(100, GeoColor.SimpleColors.Green));  


                 worldLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(areaStyle);  


   


                 // Draw a feature based on a value  


 


 


                 string stt1 = string.Empty, stt2 = string.Empty, stt3 = string.Empty;


                 stt1 = Request.QueryString["a"];


                 stt2 = Request.QueryString["b"];


                 stt3 = Request.QueryString["c"];


                 string con = ConfigurationManager.ConnectionStrings["lok"].ConnectionString;


                 SqlConnection sqlcon = new SqlConnection(con);


                 sqlcon.Open();


                 SqlCommand cmd = new SqlCommand(@"select distinct " + stt1 + " cntry_name from country_tb where " + stt2 + stt3);


                 cmd.Connection = sqlcon;


                 SqlDataReader sdr = cmd.ExecuteReader();


                 string agent_name = string.Empty;


                 if (sdr.HasRows)


                 {


                     while (sdr.Read())


                     {


                         ValueStyle valueStyle = new ValueStyle();


                         valueStyle.ColumnName = "CNTRY_NAME";


                         valueStyle.ValueItems.Add(new ValueItem(sdr[0].ToString(), new AreaStyle(new GeoSolidBrush(GeoColor.StandardColors.LightGreen))));


                         worldLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(valueStyle);


                         worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;


                     }


                 }


 


 


 


         worldLayer.FeatureSource.CustomColumnFetch += new EventHandler<CustomColumnFetchEventArgs>(FeatureSource_CustomColumnFetch);  


                 worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.RequiredColumnNames.Add("Test");  


                 


        


        LayerOverlay staticOverlay = new LayerOverlay();


        staticOverlay.IsBaseOverlay = false;  


                 staticOverlay.Layers.Add("worldLayer", worldLayer);                 


                 Map1.CustomOverlays.Add(staticOverlay); 


    }


 


 


      void FeatureSource_CustomColumnFetch(object sender, CustomColumnFetchEventArgs e)  


         {  


             if (e.Id == "135" || e.Id == "47")  


             {  


                 string columnName = e.ColumnName;  


                 e.ColumnValue = "CountryId:" + e.Id;  


             }  


         }    


}


 


 


 


 


 




Lokesh,


Thanks for your post and sample code is really helpful to find the problem.


This issue is caused that CustomColumnFetch is working with the column which is not exist, however you set


valueStyle.ColumnName = "CNTRY_NAME";


that "CNTRY_NAME" is existing in cntry02.dbf, you need to change it to another string, for example, I test


valueStyle.ColumnName = "ColumnNameNotExist";


It's working that the event is fired.


Let me know if you have more questions


Thanks,


James



 Hi James,


 


 


Thank you for the reply. Yes the event is now getting fired however i think you didnt go through my requirement. My requirement is that I want particular countries (obtained by a querry from sql)  to be filled with some colour and we could show some custom data on these countries. By changing the column name from "country_name" to some other string, it does not happen.


 


For e.g. suppose we get countries such as us,india, china from sql querry...all i want is to display these countries on the map with some colour and show custom data on these countries e.g. population....


Please look the above code and suggest me workarround for this...


 


Also, in the above code map displays the cities with in countries which i dont want to show.  


 


Thanks,


Lokesh



Lokesh, 
  
 It will be more easy than my thought, so that your problem is not "event not fired", it is "how to show different style based on column value". We provide a ValueStyle to exactly fit your requirement. To know how to use it, you can look at HowDoI sample "DrawFeaturesBasedOnValues". 
  
 Thanks, 
 James

 Hi James,


 


Thanks for the reply. This was the sample that i studied and implemented in my project. I am able to fill the country with the required colour but I am unable to add custom data on top of that particular country. For e.g. I can fill Country US with a green colour but I am not able to show the text  "united states" because it is overridden by the green colour. If you know what I mean.


 


 


 


Thanks,


Lokesh



Lokesh,  
  
 In your sample code I do not see where you are setting up a TextStyle to show the "United States" text.

 Hi ryan,


 


 


Saw your reply can you suggest me the code for adding textstyle if i were to add some custom data such as "united states, revenue 200". Also i have included an attachment with this reply to show you whats happening when i run the application and display the map. In this example you can clearly see that name argentina is overlapped by green color  and only a is visible (encircled one)...



map_problem.JPG (65.3 KB)

Lokesh,


 


Here is how to add 2 styles to one ValueItem, please have a look.


 


            ValueStyle valueStyle = new ValueStyle();


            valueStyle.ColumnName = "CNTRY_NAME";


 


            ValueItem valueItem = new ValueItem();


            valueItem.Value = "China";


            valueItem.CustomStyles.Add(TextStyles.Country1("CNTRY_NAME"));


            valueItem.CustomStyles.Add(AreaStyles.Country1);


 


            valueStyle.ValueItems.Add(valueItem);


 


            worldLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(valueStyle);


 


Thanks,


 


James


 



 Hi James, 


 


 


This code does not work....:-(  Please have a look of the screenshot that i attached with the previous reply.


 


1.) Color value style is overlapping the name of the respective country


2.) You can clearly see in the attachment that only 'a' letter of argentina is visible and the rest is hidden behind the green color. I dont want this 


 


3.) All I want is to display it other way arround i.e. to show name of the country on top of green color.


 


Please ask if anything is unclear.


 


Thanks,


Lokesh



Lokesh, 



To have the TextStyle display on top of the AreaStyle you need to add the TextStyle last. 

ValueStyle valueStyle = new ValueStyle(); 

valueStyle.ColumnName = "CNTRY_NAME"; 



ValueItem valueItem = new ValueItem(); 

valueItem.Value = "China"; 

//Area Style Drawn First 

valueItem.CustomStyles.Add(AreaStyles.Country1); 

//Text Style Drawn Last 

valueItem.CustomStyles.Add(TextStyles.Country1("CNTRY_NAME")); 



valueStyle.ValueItems.Add(valueItem); 



worldLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(valueStyle); 



Hi,


 


 


It still does not work. All I get is the map as shown in attachment. Please for once look at this attachment. 


 


I want to display name on top of the color for respective countries and only those countries should have name displayed and the rest should be blank.


 


If you could give me the complete code for doing the same thing for countries - (say) US, China....it would be wonderfull....


 


 


 


Thanks for helping,


Lokesh



Ryan, 


It doesn't matter about the adding order for styles, TextStyle always draws on top of AreaStyle.


Lokesh,


Here is the complete application, please have a look. 



Thanks,


James



8782_ValueStyle.zip (7.38 KB)

Hi James,


It worked. Thank you so much, now just an add on querry....i want to add some more custom data along with the country name....for e.g. "China rev 20"....


 


I guess the best way to do this would be to use customcolumnfetch...please suggest a way out....i included the code in my very first post however in that code customcolumnfetch event was not getting fired,


 


 


Thanks,


Lokesh


 


 


 



Lokesh,
 
The CustomColumnFetch event in your code is not raised because you didn’t have any custom column. Here is a sample how to use it, please note "Test” here is a custom column.
 
 
Thanks,
 
Ben



Post8782.zip (7.15 KB)

hi ben,


 


it didnt work



 Lokesh,


It works fine on my machine, I'm using 4.5.0.0, which version are you using? Here is a screenshot.



Thanks,


Ben



Hi Ben,


 


 


It still not getting fired... I have looked at my code and i see no difference in the one you posted accept for some sql querries...


 


Here is the code:-


protected void Page_Load(object sender, EventArgs e)

    {

        

          Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#E5E3DF"));

          RectangleShape worldExtent = new RectangleShape(-180, 90, 180, -90);

          double resolution = Math.Min(worldExtent.Width / 1075, worldExtent.Height / 562);

          PointShape centerPoint = worldExtent.GetCenterPoint();

          double minX = centerPoint.X - 1075 * resolution / 2;

          double maxY = centerPoint.Y + 562 * resolution / 2;

          double maxX = centerPoint.X + 1075 * resolution / 2;

          double minY = centerPoint.Y - 562 * resolution / 2;

          Map1.CurrentExtent = new RectangleShape(minX, maxY, maxX, minY);

                 Map1.MapUnit = GeographyUnit.DecimalDegree;  

   

                 WorldMapKitWmsWebOverlay worldMapKitOverlay = new WorldMapKitWmsWebOverlay();  

                 Map1.CustomOverlays.Add(worldMapKitOverlay);  

   

                 ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(MapPath("~/World/cntry02.shp"));  

                 AreaStyle areaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.SimpleColors.Transparent, GeoColor.FromArgb(100, GeoColor.SimpleColors.Green));  

                 worldLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(areaStyle);  

   

                 // Draw a feature based on a value  





                 string stt1 = string.Empty, stt2 = string.Empty, stt3 = string.Empty;

                 stt1 = Request.QueryString["a"];

                 stt2 = Request.QueryString["b"];

                 stt3 = Request.QueryString["c"];

                 string con = ConfigurationManager.ConnectionStrings["lok"].ConnectionString;

                 SqlConnection sqlcon = new SqlConnection(con);

                 sqlcon.Open();

                 SqlCommand cmd = new SqlCommand(@"select distinct " + stt1 + " cntry_name from country_tb where " + stt2 + stt3);

                 cmd.Connection = sqlcon;

                 SqlDataReader sdr = cmd.ExecuteReader();

                 string agent_name = string.Empty;

                 if (sdr.HasRows)

                 {

                     while (sdr.Read())

                     {

                      /*   ValueStyle valueStyle = new ValueStyle();

                         valueStyle.ColumnName = "CNTRY_NAME";

                         //valueStyle.ColumnName = "ColumnNameNotExist";

                         //ValueItem valueItem = new ValueItem();

                         //valueItem.Value = "lokesh";

                         valueStyle.ValueItems.Add(new ValueItem(sdr[0].ToString(), new AreaStyle(new GeoSolidBrush(GeoColor.StandardColors.LightGreen))));

                         valueStyle.ValueItems.Add(new ValueItem("kjkjkj", new TextStyle("CNTRY_NAME", new GeoFont("Verdana", Convert.ToSingle(99)), new GeoSolidBrush(GeoColor.StandardColors.Red))));

                         //valueItem.CustomStyles.Add(AreaStyles.Country1); 

                        // valueItem.CustomStyles.Add(TextStyles.Country1("CNTRY_NAME"));

                       

                         //valueItem.CustomStyles.Add(AreaStyles.Country1);

                       //  valueStyle.ValueItems.Add(valueItem);

                         worldLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(valueStyle);

                         

                       //  textstyle.Value = "abc";

                        // worldLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(valueStyle);

                         worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;*/





                         ValueStyle valueStyle = new ValueStyle();

                         valueStyle.ColumnName = "CNTRY_NAME";



                         ValueItem valueItem = new ValueItem();

                         valueItem.Value = sdr[0].ToString();

                         valueItem.CustomStyles.Add(new TextStyle("CNTRY_NAME", new GeoFont("Arail Black", 16, DrawingFontStyles.Bold), new GeoSolidBrush(GeoColor.StandardColors.LightSkyBlue)));

                         valueItem.CustomStyles.Add(new AreaStyle(new GeoSolidBrush(GeoColor.StandardColors.LightGreen)));

                         valueStyle.ValueItems.Add(valueItem);



                         worldLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(valueStyle);

                         worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

                     }

                 }







         worldLayer.FeatureSource.CustomColumnFetch += new EventHandler<CustomColumnFetchEventArgs>(FeatureSource_CustomColumnFetch);  

                 worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.RequiredColumnNames.Add("Test");  

                 

        

        LayerOverlay staticOverlay = new LayerOverlay();

        staticOverlay.IsBaseOverlay = false;  

                 staticOverlay.Layers.Add("worldLayer", worldLayer);                 

                 Map1.CustomOverlays.Add(staticOverlay); 

    }





      void FeatureSource_CustomColumnFetch(object sender, CustomColumnFetchEventArgs e)  

         {  

             if (e.Id == "135" || e.Id == "47")  

             {  

                 string columnName = e.ColumnName;  

                 e.ColumnValue = "CountryId:" + e.Id;  

             }  

         }

 



Lokesh, 



I compared your code and the sample code what we provided, I just found out the sql statement different between them, so I gussed maybe your problem is from the contry name, the contry02.shp dose not has the country name what you got from your database, so it cannot be rendered correctly. 



Please check the contry name detailed from the database. Also you can do a simple test in the sample code first, please set a contry name that is not existed in the contry02.shp to value of ValueItem and run it again, here is my test below: 




valueItem.Value = "Test"; 



If I set the "Test" to value of ValueItem, it cannot be rendered correctly. 



Thanks, 



Scott, 



 



Hi Scott,


 


I sorted out the issue.


 


 


Thanks


 


 



Lokesh, 
  
 That’s great! If you still have any more questions please let us know, 
  
 Thanks, 
  
 Scott,