Daily Archives: 11/21/2012 - Page 2

属性テーブルの表示example [Chapter 7-1]

属性テーブルの表示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

Main Form designはiconを使ってtoolbarにsettingします。
こんな感じ、

blog.godo-tys.jp_wp-content_gallery_mapwingis_ex07_image01.jpg
toolbar

属性値テーブル表示のiconを追加します。

Attribute View Form

Main Formから呼び出すAttribute View Form designはこんな感じ、

blog.godo-tys.jp_wp-content_gallery_mapwingis_ex07_image07.jpg
Attribute View Form

使っているcontrol類は、

  1. ToolStrip (メニュー)
  2. DataGridView (テーブル表示)
  3. 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の大まかな流れは、

  1. DataTableの取得
  2. DataGridViewのColumnの作成
  3. 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

大まかな処理の流れは、

  1. ShapeSelected=falseですべての選択状態を解除
  2. ShapeSelected(rIndex) = Trueで選択したfeatureだけを選択状態に設定
  3. SelectionColorを設定して、Redrawします。
Main Formのcodeing

blog.godo-tys.jp_wp-content_gallery_mapwingis_ex07_image02.jpg
属性値テーブル表示のbutton(一番右端のicon)

属性値テーブル表示の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は市町村人口と世帯数および人口密度を加えてものです。
blog.godo-tys.jp_wp-content_gallery_mapwingis_ex07_image03.jpg
神奈川県のサンプルshape file表示

属性値テーブル表示buttonをクリックして、属性値テーブル表示formを表示させます。
blog.godo-tys.jp_wp-content_gallery_mapwingis_ex07_image04.jpg
属性値テーブル表示画面

属性値テーブル表示form上のRowHeaderをclickしてfeatureを選択します。
blog.godo-tys.jp_wp-content_gallery_mapwingis_ex07_image05.jpg
属性値テーブルの選択状態

属性値テーブルの選択状態でRowHeaderをclickすると、そのfeatureがMain Form上のmapにgreenに色づけされて選択状態になります。
blog.godo-tys.jp_wp-content_gallery_mapwingis_ex07_image06.jpg
mapのfeature選択状態例

属性値テーブルFormは、dialog形式でshowしていないので、Main Formを操作することができます。

今回のまとめ

どうでしょうか? うまくできましたか?

では、今回のまとめを

  1. shpの属性値のdbfをDataGridViewに表示のcodeing実装を行いました。
  2. 別Formを作成して、属性値のテーブル表示を行いました。
  3. 属性値テーブルとmapの連携を実装しました。

次回[Chapter 7-2]では、メニューのToolStripにいくつかのeventの実装を行い、dbfファイルの操作をやってみたいと考えています。

vb.net2010だけでなく、C#でも、visual studio2008でも動作することができます。
簡単に自前のソフトウェアにちょっとしたGIS機能を付け加えるには良いと思います。
ex07のsource codeを公開しますので、活用してください。
ただし、あくまでの自分用のサンプルですので、バグなどがある可能性が高いので、原文のままの使用は避けてください。

サンプルコードおよびサンプルデータを使って、お使いのPCの不具合が生じても一切責任は持てませんので、あくまでも自己責任にて使用してください。

最後に、Layerを選択して次の操作を行うことを忘れないように。

Exercise

今回のProgramを少し発展させて以下の項目を付け加えてみてください。

  1. 選択したfeatureにZoomInできるようにcodeを追加する。
  2. feature(Shape_ID)を複数選択できるようにcodeを追加する。その際、Main Formのfeatureの同時に選択状態にする。

2 / 212

Social Widgets powered by AB-WebLog.com.