Daily Archives: 11/26/2012

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

属性テーブルの表示example

今回は、shape fileの属性値をDataGridView controlに表示するexample属性検索のメニューを付け加えていきます。
元になるprogramは、属性テーブルの表示example [Chapter 7-2]のex072に付け加えていきます。

Program Coding

さらに、[Chapter 7-2]でToolBarに追加してあります。
blog.godo-tys.jp_wp-content_gallery_mapwingis_ex072_image11.jpg

Form design

Main Form

Main Formの変更・追加はありません。
属性テーブルの表示example [Chapter 7-1]そのまんまです。

属性検索buttonで呼び出すQuery Formを1つ作ります。

Query Form

Attribute View Formの属性検索から呼び出すQuery Form designはこんな感じ、

blog.godo-tys.jp_wp-content_gallery_mapwingis_ex073_image01.jpg
Query Form

使用するControl類は、

  1. フィールド名を表示するListBox
  2. フィールドの値を表示するListBox
  3. 演算子のButton
  4. Queryを確認するTextBox
  5. Query条件式と実行のButton

です。

Coding

それでは、Query Formからcodingを始めていきます。

Query Form

まずは、属性検索のQuery FormのCodeは、

Imports AxMapWinGIS
Imports MapWinGIS

でdllをimportsします。
そして、変数を宣言します。

    Public t_map As New AxMapWinGIS.AxMap
    Public t_sf As New MapWinGIS.Shapefile()
    Public dgv As New DataGridView    '属性テーブルを表示しているDataGridView
 
    Private strQuery As String   'Query文の変数
Form Load時

Form Load時に初期化を行い、ListBoxのlsbFieldsにフィールド名を抽出します。

    Private Sub frmQuery_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim i As Integer
        Dim strFieldName As String = ""
        Dim myField As MapWinGIS.Field
 
        lsbFields.Items.Clear()
        For i = 0 To t_sf.NumFields - 1
            myField = t_sf.Field(i)
            strFieldName = myField.Name
            lsbFields.Items.Add(strFieldName)
        Next i
 
    End Sub

次に、lsbFieldsのitemをselectした場合とDouble Clickした場合のeventを実装します。
これは、

  1. itemをselectした場合 → 選択したフィールドの値をlsbFieldValueに表示させる。
  2. itemをDouble Clickした場合 → txtQueryに選択したフィールド名を入力させる。

ために必要となります。

lsbFields eventの実装

itemをselectした場合 → 選択したフィールドの値をlsbFieldValueに表示のCodingは、

    Private Sub lsbFields_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lsbFields.SelectedIndexChanged
        If Me.lsbFields.SelectedIndex >= 0 Then
            Dim itype As Integer = t_sf.Field(lsbFields.SelectedIndex).Type
            Me.greaterthan_op.Enabled = (itype <> 0)
            Me.greaterthanorequal_op.Enabled = (itype <> 0)
            Me.lessthan_op.Enabled = (itype <> 0)
            Me.lessthanorequal_op.Enabled = (itype <> 0)
            FieldValueSet(lsbFields.SelectedIndex)
        End If
    End Sub
 
    Private Sub FieldValueSet(ByVal fieldindex As Integer)
        '選択したフィールドから値を取得
        Dim m_sf As New MapWinGIS.Shapefile()
        m_sf.Open(t_sf.Filename)
        '重複値がないようにctUniqueValuesで値を取得する。
        m_sf.Categories.Generate(fieldindex, MapWinGIS.tkClassificationType.ctUniqueValues, 0)
 
        lsbFieldValue.Items.Clear()
 
        For rowCount As Integer = 0 To m_sf.Categories.Count - 1
            lsbFieldValue.Items.Add(m_sf.Categories.Item(rowCount).Name)
        Next rowCount
        m_sf.Categories.Clear()
        m_sf = Nothing
 
    End Sub

itemをDouble Clickした場合 → txtQueryに選択したフィールド名を入力のcodingは、

    Private Sub lsbFields_DoubleClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lsbFields.DoubleClick
        add2Query("[" & Me.lsbFields.SelectedItem & "]")
    End Sub
 
 
    Private Sub add2Query(ByVal text As String)
        If Me.txtQuery.Text = "" Then
            Me.txtQuery.Text = Me.txtQuery.Text & text
        Else
            Me.txtQuery.Text = Me.txtQuery.Text & " " & text
        End If
 
        Me.txtQuery.Focus()
        Me.txtQuery.AppendText("")
        ' Unselect the added text:
        Me.txtQuery.Select(Me.txtQuery.TextLength, Me.txtQuery.TextLength)
    End Sub

ここで、フィールド名は必ず[]で囲みます。

次に、ListBoxのlsbFieldValueのフィールド値をDouble Clickした時のeventを実装します。

lsbFieldValue Clickの実装

lsbFieldValueのフィールド値をDouble Clickした場合、lsbFieldsのDouble Clickと同様にtxtQueryに選択したフィールド値を入力させます。

    Private Sub lsbFieldValue_DoubleClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lsbFieldValue.DoubleClick
        If t_sf.Field(lsbFields.SelectedIndex).Type = FieldType.STRING_FIELD Then
            add2Query(Chr(34) & Me.lsbFieldValue.SelectedItem.ToString.Trim & Chr(34))
        Else
            add2Query(Me.lsbFieldValue.SelectedItem.ToString.Trim)
        End If
    End Sub

ここでは、FieldのtypeがString型の場合はChr(34)で記号を追加するようにしています。
String型のFieldの場合は、必ずで囲みます。

次に演算子、and,or,+,=…などのbuttonをClickした場合の実装を行います。

演算子(Operation)Button Clickの実装

演算子、and,or,+,=…などのbuttonをClickした場合のCodingは、

    Private Sub and_op_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles and_op.Click
        add2Query(" And ")
    End Sub
 
    Private Sub equals_op_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles equals_op.Click
        add2Query(" = ")
    End Sub
 
    Private Sub notequal_op_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles notequal_op.Click
        add2Query(" <> ")
    End Sub
 
    Private Sub or_op_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles or_op.Click
        add2Query(" Or ")
    End Sub
 
    Private Sub greaterthan_op_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles greaterthan_op.Click
        add2Query(" > ")
    End Sub
 
    Private Sub greaterthanorequal_op_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles greaterthanorequal_op.Click
        add2Query(" >= ")
    End Sub
 
    Private Sub not_op_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles not_op.Click
        add2Query(" Not ")
    End Sub
 
    Private Sub lessthan_op_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lessthan_op.Click
        add2Query(" < ")
    End Sub
 
    Private Sub lessthanorequal_op_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lessthanorequal_op.Click
        add2Query(" <= ")
    End Sub
 
    Private Sub like_op_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles like_op.Click
        add2Query(" Like ")
    End Sub

Subroutine add2Queryに文字列を加えていきます。

次に、実行のButtonをClickした場合の属性検索を実装します。

 属性検索の実行

属性検索の実行ButtonをClickした場合のCodingは、

    Private Sub Apply_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Apply.Click
        strQuery = Me.txtQuery.Text
        Me.lblNumFoundRows.Text = "抽出中 ..."
 
        t_sf.SelectNone()
 
        Dim objResult As Object = Nothing
        Dim [strError] As String = ""
        If t_sf.Table.Query(strQuery, objResult, [strError]) Then
            Dim shapes As Integer() = TryCast(objResult, Integer())
            Me.lblNumFoundRows.Text = String.Format("{0} shape(s) が見つかりました.", shapes.Length)
            If shapes IsNot Nothing Then
                For i As Integer = 0 To shapes.Length - 1
                    t_sf.ShapeSelected(shapes(i)) = True
                Next
            End If
 
            'mapのfeature選択
            t_map.Redraw()
 
            'Form3.DataGridView1のrow選択
            For n As Integer = 0 To t_sf.NumShapes - 1
                If t_sf.ShapeSelected(n) = True Then
                    dgv.Rows(n).Selected = True
                Else
                    dgv.Rows(n).Selected = False
                End If
            Next
        End If
    End Sub

大まかな流れは、

  1. strQueryの作成
  2. t_sf.SelectNone()でt_sfの選択状態を解除
  3. t_sf.Table.Queryで検索
  4. 検索結果によって、t_sf.ShapeSelectedで選択状態を変更
  5. mapのfeature選択のredraw
  6. 属性テーブル表示FormのDataGridView1の行の選択状態を変更

です。

Attribute View Formのcoding

それでは、属性検索Button eventを実装します。

属性検索Button eventの実装

属性検索Button event Click発生時のcodingは、

    Private Sub ToolStripButton2_Click(sender As System.Object, e As System.EventArgs) Handles ToolStripButton2.Click
        'Field Query
        Dim dlg As New frmQuery
        dlg.t_sf = t_sf
        dlg.t_map = t_map
        dlg.dgv = DataGridView1
 
        dlg.Show(Me)
 
    End Sub

属性検索Formにshapefile objectとMap ObjectとDataGridViewを渡します。

Programの実行

では、ex073を保存して実行してみましょう。

今回は、神奈川県のサンプルc14_regionDD.shpを読み込んだ後、属性値テーブル表示buttonをクリックして、属性値テーブル表示formを表示させて、属性検索ButtonをClickすると、属性検索Formが表示されます。
blog.godo-tys.jp_wp-content_gallery_mapwingis_ex073_image02.jpg
属性検索表示画面

属性検索Form上で検索条件を入力します。
blog.godo-tys.jp_wp-content_gallery_mapwingis_ex073_image05.jpg
フィールド追加表示

属性検索した結果の属性テーブル表示状態
blog.godo-tys.jp_wp-content_gallery_mapwingis_ex073_image03.jpg
属性検索した結果

属性検索した結果のMapの状態
blog.godo-tys.jp_wp-content_gallery_mapwingis_ex073_image04.jpg
属性検索した結果のMap

今回のまとめ

では、今回のまとめを

  1. 属性検索の実装を行いました。
  2. フィールド名は必ず[]で囲む。

次回[Chapter 7-4]では、dbfのExportのツールの実装を行う予定です。

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

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

Exercise

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

  1. 属性検索の選択状態を反転させるcodeを追加する。
  2. 空間検索Formの作成をしてみる。

1 / 11

Social Widgets powered by AB-WebLog.com.