属性テーブルの表示example
今回は、shape fileの属性値をDataGridView controlに表示するexampleに属性検索のメニューを付け加えていきます。
元になるprogramは、属性テーブルの表示example [Chapter 7-2]のex072に付け加えていきます。
Program Coding
Form design
Main Form
Main Formの変更・追加はありません。
属性テーブルの表示example [Chapter 7-1]そのまんまです。
属性検索buttonで呼び出すQuery Formを1つ作ります。
Query Form
Attribute View Formの属性検索から呼び出すQuery Form designはこんな感じ、
使用するControl類は、
-
フィールド名を表示するListBox
-
フィールドの値を表示するListBox
-
演算子のButton
-
Queryを確認するTextBox
-
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を実装します。
これは、
-
itemをselectした場合 → 選択したフィールドの値をlsbFieldValueに表示させる。
-
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
大まかな流れは、
-
strQueryの作成
-
t_sf.SelectNone()でt_sfの選択状態を解除
-
t_sf.Table.Queryで検索
-
検索結果によって、t_sf.ShapeSelectedで選択状態を変更
-
mapのfeature選択のredraw
-
属性テーブル表示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が表示されます。
属性検索表示画面
今回のまとめ
では、今回のまとめを
-
属性検索の実装を行いました。
-
フィールド名は必ず[と]で囲む。
次回[Chapter 7-4]では、dbfのExportのツールの実装を行う予定です。
vb.net2010だけでなく、C#でも、visual studio2008でも動作することができます。
簡単に自前のソフトウェアにちょっとしたGIS機能を付け加えるには良いと思います。
ex073のsource codeを公開しますので、活用してください。
ただし、あくまでの自分用のサンプルですので、バグなどがある可能性が高いので、原文のままの使用は避けてください。
サンプルコードおよびサンプルデータを使って、お使いのPCの不具合が生じても一切責任は持てませんので、あくまでも自己責任にて使用してください。
Exercise
今回のProgramを少し発展させて以下の項目を付け加えてみてください。
-
属性検索の選択状態を反転させるcodeを追加する。
-
空間検索Formの作成をしてみる。
最近のコメント