属性テーブルの表示example
今回は、shape fileの属性値をDataGridView controlに表示するexampleを作成します。Mapコントロールの追加example [Chapter 2]では、個別属性値をMessegeBoxに表示していましたが、今回はすべてのfeatureの属性値をテーブルに表示するexampleです。
元になるprogramは、カテゴリー分類example [Chapter 6-2]のex06に付け加えていきます。
また、属性値テーブルとmapとの連携もprogramしてみます。
Program Coding
今回は、カテゴリー分類example [Chapter 6-2]に若干designを付け加えます。
併せて属性値テーブルを表示Table formを作成します。
属性値テーブルを表示formの作成は、カテゴリー分類example [Chapter 6-2]のカテゴリー分類の設定formの作成と同様な方法で作成します。
Form design
Main Form
Attribute View Form
Main Formから呼び出すAttribute View Form designはこんな感じ、
使っているcontrol類は、
-
ToolStrip (メニュー)
-
DataGridView (テーブル表示)
-
StatusBar
です。
Coding
それでは、Attribute View Form(Form3)からcodingを始めていきます。
属性値テーブル表示の作成
まずは、テーブル作成のfunction は、
Private Function AddTable() As Boolean 'create attribute table Dim myField As MapWinGIS.Field 'Variables datatable m_DataTable = New DataTable() Dim myDataColumn As DataColumn Dim myDataRow As DataRow 'Create Shape_ID myDataColumn = New DataColumn() myDataColumn.ColumnName = "Shape_ID" myDataColumn.DataType = GetType(Integer) m_DataTable.Columns.Add(myDataColumn) 'Add the columns to the table based on the fields For fld As Integer = 0 To t_sf.NumFields - 1 myDataColumn = New DataColumn() myField = t_sf.Field(fld) 'Use the existing field name in order to give the column a name myDataColumn.ColumnName = myField.Name 'Set up columns with different data types depending on the type specified in the shapefile If myField.Type = MapWinGIS.FieldType.DOUBLE_FIELD Then myDataColumn.DataType = GetType(Double) ElseIf myField.Type = MapWinGIS.FieldType.INTEGER_FIELD Then myDataColumn.DataType = GetType(Integer) Else myDataColumn.DataType = GetType(String) End If 'Add each column m_DataTable.Columns.Add(myDataColumn) Next 'Add the rows to the table based on the cell values For shp As Integer = 0 To t_sf.NumShapes - 1 myDataRow = m_DataTable.NewRow() myDataRow(0) = shp 'Each row has information for all the columns. For fld As Integer = 0 To t_sf.NumFields - 1 myField = t_sf.Field(fld) ' This just explicitly casts from the object values into the correct ' field type for the Data Grid If myField.Type = MapWinGIS.FieldType.DOUBLE_FIELD Then myDataRow(fld + 1) = If(IsDBNull(t_sf.CellValue(fld, shp)), 0, CDbl(t_sf.CellValue(fld, shp))) ElseIf myField.Type = MapWinGIS.FieldType.INTEGER_FIELD Then myDataRow(fld + 1) = If(IsDBNull(t_sf.CellValue(fld, shp)), 0, CInt(t_sf.CellValue(fld, shp))) Else myDataRow(fld + 1) = DirectCast(t_sf.CellValue(fld, shp), String) End If Next ' Once we add the values to a row, add the rows to the table. m_DataTable.Rows.Add(myDataRow) Next DataGridView1.DataSource = m_DataTable ToolStripStatusLabel1.Text = "DataCount =" & m_DataTable.Rows.Count.ToString AddTable = True End Function
AddTableの大まかな流れは、
-
DataTableの取得
-
DataGridViewのColumnの作成
-
DataGridViewのrowに追加
となります。
RecordSetなどで一括でdbfから取得できれば良いのでしょうが、MapWinGISにはその機能がないため、DataTableを作成してDataGridViewにbindingさせます。
このAddTableを次のForm load eventから呼び出します。
Form load時
まずは、Form load時の実装ですが、その前に、
Imports AxMapWinGIS Imports MapWinGIS
を忘れずに。
変数とオブジェクトの定義も、
Public t_map As New AxMapWinGIS.AxMap Public t_sf As New MapWinGIS.Shapefile() Public t_legend As New LegendControl.Legend Public t_LayerHandle As Integer Private m_DataTable As DataTable 'dbfの格納場所
publicの定義は、Main Formから呼び出す際に使用します。
Form load時のcodeは、
Private Sub Form3_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load DataGridView1.Dock = DockStyle.Fill AddTable() 'DataGridView1にユーザーが新しい行を追加できないようにする DataGridView1.AllowUserToAddRows = False 'DataGridView1の行をユーザーが削除できないようにする DataGridView1.AllowUserToDeleteRows = False End Sub
な感じで実装します。
簡単なので説明不要ですよね。
Form3_FormClosing event時
formを閉じた時に、Map上のfeatureの選択状態を解除しておきます。
Private Sub Form3_FormClosing(sender As System.Object, e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing 'selected false set For i = 0 To t_sf.NumShapes - 1 t_sf.ShapeSelected(i) = False Next i t_map.Redraw() End Sub
これで後は、Main FormのcodeingでOKなのですが、せっかくなので、属性値テーブルを選択した時に、map上でfeatureを選択状態にしてみます。
これは、DataGridViewのRowsHeaderのclick eventに実装してみます。
DataGridView1_RowHeaderMouseClick event時
e.RowIndexには選択したfeature(shape_ID)が取得できるので、このe.RowIndexを使って、Function ShpSelectでmap上にfeatureの選択を行います。
Private Sub DataGridView1_RowHeaderMouseClick(sender As System.Object, e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DataGridView1.RowHeaderMouseClick 'featureの選択 ShpSelect(e.RowIndex) End Sub
次にFunction ShpSelectは、
Private Function ShpSelect(ByVal rIndex As Integer) As Boolean ' selected Feature Dim i As Integer ShpSelect = False For i = 0 To t_sf.NumShapes - 1 t_sf.ShapeSelected(i) = False Next i t_sf.ShapeSelected(rIndex) = True 'select color = green set 'default color = yellow t_sf.SelectionColor = System.Convert.ToUInt32(RGB(0, 255, 0)) 'Green t_map.Redraw() ShpSelect = True End Function
大まかな処理の流れは、
-
ShapeSelected=falseですべての選択状態を解除
-
ShapeSelected(rIndex) = Trueで選択したfeatureだけを選択状態に設定
-
SelectionColorを設定して、Redrawします。
Main Formのcodeing
属性値テーブル表示のbutton click event発生時のcodingは、
Private Sub ToolStripButton4_Click(sender As System.Object, e As System.EventArgs) Handles ToolStripButton4.Click 'set attribute table If AxMap1.NumLayers > 0 Then Dim frmAttribute As New Form3() frmAttribute.Text = "属性テーブル: 選択Layer名=[" & Legend1.Map.LayerName(layerHandle) & "]" frmAttribute.t_map = AxMap1 frmAttribute.t_legend = Legend1 frmAttribute.t_sf = AxMap1.get_GetObject(layerHandle) frmAttribute.t_LayerHandle = layerHandle frmAttribute.Show(Me) End If End Sub
Form3をfrmAttributeとして作成して、Form3のpublic宣言してるobject変数に入れます。
カテゴリー分類の設定のForm2の設定とほぼ同じですね。
Programの実行
では、ex07を保存して実行してみましょう。
今回は、神奈川県のサンプルc14_regionDD.shpを読み込んで表示させます。c14_regionDD.shpは市町村人口と世帯数および人口密度を加えてものです。
神奈川県のサンプルshape file表示
属性値テーブル表示buttonをクリックして、属性値テーブル表示formを表示させます。
属性値テーブル表示画面
属性値テーブル表示form上のRowHeaderをclickしてfeatureを選択します。
属性値テーブルの選択状態
属性値テーブルの選択状態でRowHeaderをclickすると、そのfeatureがMain Form上のmapにgreenに色づけされて選択状態になります。
mapのfeature選択状態例
属性値テーブルFormは、dialog形式でshowしていないので、Main Formを操作することができます。
今回のまとめ
どうでしょうか? うまくできましたか?
では、今回のまとめを
-
shpの属性値のdbfをDataGridViewに表示のcodeing実装を行いました。
-
別Formを作成して、属性値のテーブル表示を行いました。
-
属性値テーブルとmapの連携を実装しました。
次回[Chapter 7-2]では、メニューのToolStripにいくつかのeventの実装を行い、dbfファイルの操作をやってみたいと考えています。
vb.net2010だけでなく、C#でも、visual studio2008でも動作することができます。
簡単に自前のソフトウェアにちょっとしたGIS機能を付け加えるには良いと思います。
ex07のsource codeを公開しますので、活用してください。
ただし、あくまでの自分用のサンプルですので、バグなどがある可能性が高いので、原文のままの使用は避けてください。
サンプルコードおよびサンプルデータを使って、お使いのPCの不具合が生じても一切責任は持てませんので、あくまでも自己責任にて使用してください。
最後に、Layerを選択して次の操作を行うことを忘れないように。
Exercise
今回のProgramを少し発展させて以下の項目を付け加えてみてください。
-
選択したfeatureにZoomInできるようにcodeを追加する。
-
feature(Shape_ID)を複数選択できるようにcodeを追加する。その際、Main Formのfeatureの同時に選択状態にする。
最近のコメント