ThinkGeo.com    |     Documentation    |     Premium Support

DataTable and map

Hi,


I am developing an application. It contains a module where I have to use DataTable to store some database. How can I highlight / display  the features(data) in the DataTable on the map?


 


Or else even if we click on a sigle row(selected row) of DataTable , how to display corresponding feature  on map ?



Sneha,


I am sorry to say that I might misunderstand you by not getting results back from the API. If you want to highlight some specified features, please take a reference on the following HowDoI sample, I think it is doing what we want to achieve:
HowDoI\ Dynamic Shapes\ Highlight A Feature On The Map
 
Any more questions please feel free to let me know.
 
Thanks.
 
Yale

Thanks for your feedback.


 


I have attached a screenshot which will give you an idea of what  I am doing.


In the screenshot, an attribute table has been shown. 


I have to achieve the following:


Whenever a row has been clicked it is selected (here its in blue color) and the corresponding feature (state in blue color) gets highlighted.



Datatable.zip (24.6 KB)

Sneha,


I understood your mean exactly, here is the code snippet for you below:



  private void SqlQuery_Load(object sender, EventArgs e)
        {
            winformsMap1.MapUnit = GeographyUnit.DecimalDegree;
            winformsMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);

            WorldMapKitWmsDesktopOverlay worldMapKitDesktopOverlay = new WorldMapKitWmsDesktopOverlay();
            winformsMap1.Overlays.Add(worldMapKitDesktopOverlay);

            ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(@"..\..\SampleData\Data\USStates.shp");
            worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.SimpleColors.Transparent, GeoColor.FromArgb(100, GeoColor.SimpleColors.Green));
            worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.LineJoin = DrawingLineJoin.Round;
            worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

            LayerOverlay staticOverlay = new LayerOverlay();
            staticOverlay.Layers.Add("WorldLayer", worldLayer); 
            winformsMap1.Overlays.Add(staticOverlay);

            InMemoryFeatureLayer highlightLayer = new InMemoryFeatureLayer();
            highlightLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            highlightLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.FromArgb(100, GeoColor.StandardColors.DarkGreen));

            LayerOverlay highlightOverlay = new LayerOverlay();
            highlightOverlay.Layers.Add("HighlightLayer", highlightLayer);
            winformsMap1.Overlays.Add("HighlightOverlay", highlightOverlay);

            winformsMap1.CurrentExtent = new RectangleShape(-165.7421875, 80.23046875, -35.6640625, 13.08203125);
            winformsMap1.Refresh();

            worldLayer.Open();
            DataTable dataTable = worldLayer.QueryTools.ExecuteQuery("Select * from USStates Where PERIMETER > 30 Order by PERIMETER");
            worldLayer.Close();

            dgridResult.DataSource = dataTable;
        }

        private void dgridResult_SelectionChanged(object sender, EventArgs e)
        {
            DataGridView view = sender as DataGridView;
            DataGridViewRow row = view.CurrentRow;

            FeatureLayer worldLayer = winformsMap1.FindFeatureLayer("WorldLayer");
            InMemoryFeatureLayer highlightLayer = (InMemoryFeatureLayer)winformsMap1.FindFeatureLayer("HighlightLayer");

            worldLayer.Open();
            Feature feature = worldLayer.QueryTools.GetFeatureById(row.Cells["RecID"].Value.ToString(), ReturningColumnsType.AllColumns);
            worldLayer.Close();

            highlightLayer.InternalFeatures.Clear();
            highlightLayer.InternalFeatures.Add(row.Cells["RecID"].Value.ToString(), feature);

            winformsMap1.Refresh(winformsMap1.Overlays["HighlightOverlay"]);
        }

This is just a sample for you, you need to reference the USStates.shp to run the sample properly,


Thanks,


Scott,



Hi, 
  
 Thanks for the feedback. 
 Can U please elaborate on the statement: 
  
  DataGridView view = sender as DataGridView; 
  
 I am unable to understand it. 
  
 And also the above code is applicable for the .shp files whose database contains "RECID" as field 
 How can it be made generalised ?? 
  
 Thanks, 
 Sneha

Sneha,


Thanks for your post and questions.
 
I think Scott has hooked up an event for the DataGridView in the following way, so in the dgridResult_SelectionChanged event, we can convert the sender into DataGridView as he has suggested.
 
dgridResult.SelectionChanged += new EventHandler(dgridResult_SelectionChanged);
 
I am not quite understood what do you mean by generalized the column? We can change it to a specified reasonable column value if we want.
Any more questions please feel free to let me know.
 
Thanks.
 
Yale

Hi, 
  
 Thanks for the feedback. 
  
 In the above code, we are using "RECID" field. So the code will work only for the files whose database contains the field "RECID". But there are some files which does not contain "RECID" field. They might contain "PROPERTYNO" or anything different.  
  
 How to make the above code flexible so that it can support any files ??? 
  
 Thanks, 
 Sneha

Sneha,


I just give you the sample snippet, you can change the sample code according to your mind, for example, if the columns contains the "PROPERTYNO" or anything else, you just need to change this code to:



highlightLayer.InternalFeatures.Add(row.Cells["PROPERTYNO"].Value.ToString(), feature);

You can change the column name to anything else what you want, I just gave you a sample code,


Thanks,


Scott,


 



Hi, 
  
 I guess you misunderstood the question. Sorry for that. 
  
 In the above statement, you have entered "PROPERTYNO" in the column field. 
 So this is something we had  hardcoded it . 
 Is there any other way wherein the application should take on the primary key(column) itself accordingly . 
 We need not pass it.

Sneha,


I do not quite understand exactly what do you mean by “Primary key”, as all the columns are the same status which is different with the SQL Server table. While, we definitely can make it automatically find the target column, following code snippet shows you how to find the middle column in sequence.
 

InMemoryFeatureLayer highlightLayer = new InMemoryFeatureLayer();
highlightLayer.Open();
 
int midCount = highlightLayer.GetColumns().Count /2;
string name = highlightLayer.GetColumns()[midCount].ColumnName;

 
Any more questions please feel free to let me know.
 
Thanks.
 
Yale

Hi, 
  
 Thanks for your feedback. 
  
 One more doubt !!! 
 In the code, you have mentioned "RECID" which is unique for each record (row) for that particular file(USStates.shp).  
 i.e. No two rows have same "RECID". 
  
 So how to code to find such fields having unique values for every rows. 
  
 Or should I generate a column named suppose "UID" at the time of creation of  the DataTable and assign it values serially  so each row will have a separate n unique key of itself. 
  
 I have another question !!! 
 In the above code, we can select only one row at a time and highlight the corresponding feature. How can we select multiple rows at a time using "Ctrl+MouseClick" and highlight correspondingly ??

Sneha, 
  
 I’m looking for a solution on that, there are any results I will let you know, 
  
 Thanks, 
  
 Scott,

Hi,



I have attached a snapshot. In this, when we click on a row the corresponding feature gets highlighted. This code is mentioned by you above. Now I need some modifications. Here we were selecting a single row. But now I need to select multiple rows. How can I do this ??



001_Datatable.zip (21.8 KB)

Sneha, 
  
 Thanks for your post and questions.  
  
 I am curious what control are you using to hold the data in the “Attributes of States”?  Could you provide us a sample to show how you implement the single row highlighted? If you want, you can attach the sample to the discussion form or send it to our support (support@thinkgeo.com) and ask to forward to Scott and Yale for this post. 
  
 Any more questions please feel free to let me know. 
  
 Thanks. 
  
 Yale