ThinkGeo.com    |     Documentation    |     Premium Support

How to use stomcolomnfetch property in asp.net mvc

hi


i am making a simple map of pakistan.At first   i used the custom data on the map by using customcolumnfetcheventargs property in web forms (mapsuite wed evaluation eddition). it worked well. now i am converting my app in mvc. now my question is that how can i use that custom colomn fetch property in mvc for using custom data like population on the map. ?


my code using web forms was as following.......


//page load event


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

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

 


//function 


public void FeatureSource_CustomColumnFetch(object sender, CustomColumnFetchEventArgs e)

        {

            ShapeFileFeatureLayer provinceLayer = new ShapeFileFeatureLayer(@"C:\Users\ahsan\Desktop\shapefiles\PAK_adm1.shp");



            provinceLayer.Open();

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

            provinceLayer.Close();



            string featureName = feature.ColumnValues["NAME_1"];

          /*  for (int i = 0; i < provinceNames.Count(); i++)

            {

                if (provinceNames == featureName)

                {

                    e.ColumnValue = provincePopulation.ToString();

                }

            }*/

 } 

 


provide me some sample coding example if you can , beecause i really do not know how to proceed...


and i could not find any help regarding about my problem  in your mvc samples and discussion forums..... 


and reply me as soon as possible...


thanks 


ahsan   



I watched the video named using custom data but it did not show the map . on browser map object's info was shown in text form. as shown bellow


 


ZoomLevelSet=&MapBackground=&ContextMenu=&CurrentExtent=&Cursor=&WebConfigRegisterMode=&ResourceDeploymentMode=&MapUnit=&ActiveBaseOverlay=&BackgroundOverlay=&StaticOverlay=&DynamicOverlay=&MarkerOverlay=&CustomOverlays=&EditOverlay=&HighlightOverlay=&AdornmentOverlay=&MapTools=&WidthInPixels=&HeightInPixels=&OnClientDrawEnd=&OnClientEditEnd=&OnClientClick=&OnClientDoubleClick=&OnClientExtentChanged=&OnClientBaseOverlayChanged=&OnClientTrackShapeFinished=&Popups=&RestrictedExtent=&Version=MapSuiteCore%3a6.0.0.0%3bWebEdition%3a6.0.0.0&CurrentScale=&CustomCursorUri=&Id=cmap&Name=map&Width=&Height=&Visible=&HtmlAttributes=&ClientScriptFileNames=&ClientScriptBlocks=&StyleSheetFileNames=&ViewContext= ThinkGeo.MapSuite.MvcEdition.Map


i'm using "@{Html.ThinkGeo().Map(Model).Render();}" this helper of thinkgeo..........


whats the problem i didn't get . . . !


help me ..



 Hi Ahsan,


 
The problem might be that map is initialized in the Razor engine, would you please try defining the map and registering any events in the controller. Like the following codes:
 
public ActionResult LoadAShapeFileFeatureLayer()
        {
            Map map = new Map("Map1",
                    new System.Web.UI.WebControls.Unit(100, System.Web.UI.WebControls.UnitType.Percentage),
                    510);
            map.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#E5E3DF"));
            map.CurrentExtent = new RectangleShape(-125, 72, 50, -46);
            map.MapUnit = GeographyUnit.DecimalDegree;
 
            ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(Server.MapPath("~/App_Data/cntry02.shp"));
            worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.FromArgb(100, GeoColor.SimpleColors.Green), GeoColor.SimpleColors.Red, 2, LineDashStyle.Solid);
            worldLayer.FeatureSource.CustomColumnFetch += new System.EventHandler<CustomColumnFetchEventArgs>(FeatureSource_CustomColumnFetch);
 
            return View(map);
        }
 
And just using the below code in the razor side:
 
Html.ThinkGeo().Map(Model).Render();
 
Hope it helps
 
Johnny
 

thanks 
 yes it worked. :) 
 but object info is also been shown as in previous case. means map is been displayed along with the object info . want to remove it … 
 ahsan

 Hi Ahsan, 


Would you please replace “@Model ThinkGeo.MapSuite.MvcEdition.Map” with “@model ThinkGeo.MapSuite.MvcEdition.Map” and try it again, we met a similar problem and solved with the that way.


If you have any more problem, please feel free to let us know.


 


Hope it helps


 


Johnny



thanks.


as you told, i have managed my map. actually i am making a map of pakistan on which i want to show the custom data like population on different levels as in usa state level or county levels but in pakistan we have province ,division , district levels etc. i will use a colour scheme to show the strength of the data on the user selected area of the map. user will select the area from the dropdown list. that area will be colored using colour scheme as i told. i have a submit button on submitting which my action method updatemap will be called.  now problem is i dont know how to return the updated map on the same view on which first time i rendered the map? i know ajax implimentation will be used here but i didn't get the idea how will it be implimented . can you give me some idea and some sample code ? and can you rffer me some sample application ? 


 


thanks,


ahsan.    



Hi Ahsan,


I think this is the sample you requested. It has one InMemoryFeaturelayer and a button on the upper right corner. When click on the button, we change the layer's style randomly and update the map in the same page.


Please let me know if you have more queries.


Thanks,

Howard 



UpdateMapStyles.zip (78.7 KB)

thanks .


can you please explain the ajax implimentation of your provided sample code? means specially the following statement,



Map1.redrawLayer('DynamicOverlay');


  


what is Map1 here and how is it accessible in the view if it is the same map which is been sent by the controller? what about DynamicOverlay, is this the same which is been made in controller ? how is it excessible in view ?


actually problem is that sample app is updating a single layer and i want to update the whole overlay.and i don't know which property can be used like you used map1.redrawLayer.


in my updateMap function which is called by using  ajax call , i first get map from sessions then i simply extract overlay and then extract the layers and then i search required feature(given by the user from dropdown list) in the layers, then i add the feature to a inmemoryfeaturelayer and then change its style and then add that layer to the overlay and after that i simply redraw the overlay. at first i used mapsuite web evaluation eddition. in that eddition my function performs well and accurate results , but now i am converting my app in mvc app. can you tell me where i should redraw the overlay like in controller or in view during ajax call? hope you are getting my problem. 



Also when i tried to call my click event through ajax call then it didn’t work. . . 
  
 please explain this statement also. 
  
 
Map1.ajaxCallAction(’@ViewContext.RouteData.Values[“Controller”].ToString()’, ‘UpdateStyle’, {}, function (e) {
                Map1.redrawLayer(‘DynamicOverlay’);
            


I have sorted it out. now my next step is to change the style of the user selected feature from the drop down list. and i want to change style of that feature along with the custom data shown on that feature also(custom data will be taken from database). 

i have written some code but it have 2 problems

1. each time when ajax request is sent then inmemoryfeature layer is again added which is normal. but it remains added in that overlay when next request is made. means if i have selected a feature in first request and on server side its style is changed(its fill color is changed) then idealy on next call the previous changes must be removed but it does not happen........ plz let me know a way to tackle it.



2. i want to show the custom data of the selected feature on the map. for that purpose i have passed the column values of a particular layer to the inmemory layer on its declaration time , but this technique also didn't work.





please take a look on the attached file and modify my code and let me have it. and reply as soon as possible.

thanks,

ahsan



New_Text_Document_(2).txt (8.94 KB)

 Hi ahsan, 


Sorry for the delay. 


Firstly, please allow me to explain the earlier questions you asked. 


Q1: explain those code “Map1.redrawLayer('DynamicOverlay');”. 


The “Map1” is the base Map object at client side, whose name is the same as the ID of the Map class defined in server. The reason why we can access this object is because we created this object with JavaScript when loading the map from server. Besides, there are many functions attached to the Map object,  like “ajaxCallAction”,” redrawLayer”,” zoomTo/Out”,” getMapParser”, etc. More details, please reference to: download.thinkgeo.com/docs/mvc/clientapi/


 


Q2: when i tried to call my click event through ajax call then it didn't work. . .  


As for why the client event you mentioned didn’t work, I guess you can compare it with the sample “AddAMarker” in our HowDoISimple.


 


Q3: you post on 6/2.


After check your sample code, it’s hard to say I can understand your questions clearly. But I guess the below answers might be useful:


1.       I might didn’t know the reason clearly why the layer style you set at before didn’t change. But here is a simple way to help you to debug:



 


From the screen shot, we can see all the styles “CustomStyles”,“AreaStyle”,”LineStyle”,”TextStyle” at ZoomLevel 01, so does the zoom level from 02 to 20. With this way, when we found some styles that are not our expected, we can choose clear the style and then reset it.


1.       Can you do a check to make sure the inmemory layer’s style like text style  can match with the column values?


 


If you have any more questions, please feel free to let us know.


 


Thanks,


 


 


Johnny




 Hi ahsan,


 
Sorry for the delay.
 
Firstly, please allow me to explain the earlier questions you asked.
 
Q1: explain those code “Map1.redrawLayer('DynamicOverlay');”.
 
The “Map1” is the base Map object at client side, whose name is the same as the ID of the Map class defined in server. The reason why we can access this object is because we created this object with JavaScript when loading the map from server. Besides, there are many functions attached to the Map object,  like “ajaxCallAction”,” redrawLayer”,” zoomTo/Out”,” getMapParser”, etc. More details, please reference to: download.thinkgeo.com/docs/mvc/clientapi/
 
Q2: when i tried to call my click event through ajax call then it didn't work. . . 
 
As for why the client event you mentioned didn’t work, I guess you can compare it with the sample “AddAMarker” in our HowDoISimple.
 
Q3: you post on 6/2.
After check your sample code, it’s hard to say I can understand your questions clearly. But I guess the below answers might be useful:
1.I might didn’t know the reason clearly why the layer style you set at before didn’t change. But here is a simple way to help you to debug:

 
From the screen shot, we can see all the styles “CustomStyles”,“AreaStyle”,”LineStyle”,”TextStyle” at ZoomLevel 01, so does the zoom level from 02 to 20. With this way, when we found some styles that are not our expected, we can choose clear the style and then reset it.
2.Can you do a check to make sure the inmemory layer’s style like text style  can match with the column values?
 
If you have any more questions, please feel free to let us know.
 
Thanks,
 
Johnny
 

thanks johnny.

your answers helped me a lot . as you know i am trying to make an application on which user will be able to know the volume of the data on the map. different volumes will be represented by different color schemes. like population of a feature is colored by different intensity depending upon its population size. actually johnny, i have done this , i have managed my color scheme . now problem is that i want to show the user my color scheme scale. and i don’t know how can i do this . does thinkgeo provide this functionality built in. as shown in bellow snapshot . please find my image in attachments. i want to show the user  SCALE that if particular color is shown on map then it means population ranges from certain values. 

thanks 

ahsan  


plz chk my requirement in the attachment 

001_colortool2.jpg (47.6 KB)

Hi Ahsan,



Thanks for
picture, attached is the sample code, would you please try it? If you have
any more problem, please feel free to let us know.



Hope it
helps


Summer



ClassBreakStyle.zip (262 KB)

thanks summer, but you did not get me. i have solve my coloring problem , i just wanted to show the scale of the color scheme as i pointed out with an arrow in my last image attachment, help me with that. does thinkgeo provide that facility to show the scale along with the map? 
 any idea will be appreciated. moreover please explain the purpose of class break style and its advantage over the value style… 
 thanks 


Hi Ahsan,


Sorry we misunderstood
the case. Attached sample should fit the function now.


Following is the difference between classbreakstyle and valuestyle:




The classbreakstyle: It displays a shape's style depending on if the shape's column-value is inside a range.


More information about the break
style please reference: wiki.thinkgeo.com/wiki/Think...ClassBreak




The valueStyle: It displays  a shape's style depending on if the shape's column-value equals a value.


More information about the value
style please reference: wiki.thinkgeo.com/wiki/Think...ValueStyle




If the scenario is still misunderstood, please feel free to correct us.


Hope it helps


Summer



ClassBreakStyleModified.zip (255 KB)

thanks Summer , when i run your sample code then map with clasbreakstyle applied was shown on browser but not the legend. except i was given with an error on the top of the map screen “Parameter is not valid”. i observed same error in google chrome latest eddition and IE 8 also. i am using window 8. can’t understand why …  
 ahsan

Thanks Summer , when i run your sample code then map with clasbreakstyle applied was shown on browser but not the legend. except i was given with an error on the top of the map screen “Parameter is not valid”. i observed same error in google chrome latest eddition and IE 8 also. i am using window 8. can’t understand why … ! 
 Ahsan

Hi ahsan, 



Would you please give us more information, like your dlls version, your culture info. We also tested it on IE8 win8, even published it, but the problem still didn’t show up, the dlls we are using is 7.0.9.0. Following is a result image of our test





Waiting for your further information



Summer