簡単なGeoProcessingのexample
今回は、SpatialQuery(空間検索)を作成してみます。属性テーブルの表示example [Chapter 7-3]でShape fileの属性検索を行いましたが、空間検索は、位置情報から検索を行うものです。
空間検索について、ArcGIS Tipsの検索にまとめられていますので、一読してください。
元になるprogramは、簡単なGeoProcessingのexample [Chapter 9-1]のex09に付け加えていきます。
Program Coding
今回は、簡単なGeoProcessingのexample [Chapter 9-1]に若干designを付け加えます。
併せてDissolve作成の設定formを作成します。
Dissolve作成の設定formの作成は、カテゴリー分類example [Chapter 6-2]のカテゴリー分類の設定formの作成と同様な方法で作成します。
Form design
Main Form
Main Form designはiconを使ってtoolbarにsettingします。ex09そのまんまですね。
こんな感じ、
ToolStripContainerを使って、ToolStripbarを追加しています。
次に、空間検索の設定formを作成します。
空間検索の設定Form
Coding
それでは、空間検索の設定Form(frmSpatialQuery)からcodingを始めていきます。
空間検索の設定で必要なデータは、
-
検索対象のShape file
-
選択するためのShape file
-
検索方法
が必要になります。
frmSpatialQuery load時
まずは、参照の追加で、
-
MapWinUtility.dll
-
MapWindow.Interfaces.dll
を追加しておきます。
Objectをimportsして、変数などの定義をします。
Imports System.IO Imports MapWindow.Interfaces Imports System.Windows.Forms Imports MapWinUtility Public Class frmSpatialQuery Public t_map As New AxMapWinGIS.AxMap '検索対象のshapefile Private ch_sf As New MapWinGIS.Shapefile() '選択するshapefile Private rl_sf As New MapWinGIS.Shapefile() End Class
Form load時のcodeingは、
Private Sub frmSpatialQuery_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load cmbRelation.Items.Clear() cmbRelation.Items.Add("含む (Contain)") cmbRelation.Items.Add("交わる (Cross)") cmbRelation.Items.Add("含まれない (Disjoint from)") cmbRelation.Items.Add("等しい (Equal)") cmbRelation.Items.Add("交差する (Intersect)") cmbRelation.Items.Add("重なる (Overlap)") cmbRelation.Items.Add("接する (Touch)") cmbRelation.Items.Add("内在する (Within)") cmbRelation.SelectedIndex = 0 ' Add initialization 'Layer名を追加 PopulateLayerList(cmbSubject) PopulateLayerList(cmbSelection) End Sub
axMap objectをt_mapでMain formから受け渡されます。
cmbRelationに検索方法を入れておきます。
このcmbRelationは、enum tkSpatialRelationから設定します。
enum tkSpatialRelationの検索方法
PopulateLayerList()で、Main FormのMap上のShape fileのLyernameをComboBoxに入れます。
空間検索の実行
空間検索はOK buttonのclick eventに実装します。Codeは、
Private Sub btnOk_Click(sender As System.Object, e As System.EventArgs) Handles btnOk.Click If cmbSubject.Text = String.Empty Then Logger.Msg("検索対象Layerが選択されていません。") ElseIf cmbSelection.Text = String.Empty Then Logger.Msg("選択するためのLayerが選択されていません。") ElseIf cmbSubject.Text = cmbSelection.Text Then Logger.Msg("同じLayerが選択されています。") Else 'set shapefile ch_sf = t_map.get_GetObject(cmbSubject.SelectedIndex) rl_sf = t_map.get_GetObject(cmbSelection.SelectedIndex) If Not ch_sf Is Nothing And Not rl_sf Is Nothing Then Cursor.Current = Cursors.WaitCursor 'Spqtial Query Dim ShapeIDs As Object = Nothing If ch_sf.SelectByShapefile(rl_sf, CType(cmbRelation.SelectedIndex, MapWinGIS.tkSpatialRelation), False, ShapeIDs) Then If ShapeIDs.Length > 0 Then Dim shapes As Integer() = TryCast(ShapeIDs, Integer()) If shapes IsNot Nothing Then For i As Integer = 0 To shapes.Length - 1 ch_sf.ShapeSelected(shapes(i)) = True Next End If t_map.Redraw() ToolStripStatusLabel1.Visible = True ToolStripStatusLabel1.Text = String.Format("{0} shape(s) が見つかりました.", shapes.Length) End If End If Cursor.Current = Cursors.Default End If rl_sf = Nothing End If End Sub
SpatialQuery(空間検索)の大まかな流れは、
-
変数類のチェック
-
SelectByShapefile
-
検索結果からshapeをselect
-
Main FormのMapのShapeを選択状態にする
となります。
SpatialQuery(空間検索)のStatementは、
SelectByShapefile(rl_sf, CType(cmbRelation.SelectedIndex, MapWinGIS.tkSpatialRelation), False, ShapeIDs)です。
検索結果のShapeIndexがShapeIDs objectに格納されます。
詳細は、MapWinGIS Activex GeoProcessingを参考にしてください。
空間検索で使うSelectByShapefileを抜粋すると、
となっています。
このSpatialQuery(空間検索)の設定Formを次のMain Formから呼び出します。
Main Formのcodeing
SpatialQuery(空間検索)の設定のbutton click event発生時のcodingは、
Private Sub SpatialQueryToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles SpatialQueryToolStripMenuItem.Click 'set SpatialQuery If AxMap1.NumLayers > 0 Then Dim frmSpatialQuery As New frmSpatialQuery() frmSpatialQuery.Text = "空間検索" frmSpatialQuery.t_map = AxMap1 frmSpatialQuery.ShowDialog(Me) End If End Sub
AxMap1のobjectを引き渡します。
Programの実行
では、ex093を保存して実行してみましょう。
今回は、神奈川県のサンプルc14_regionDD.shpとc14_railroad.shpを読み込んで表示させます。
ツール→SpatialQuery(空間検索)を表示させます。
SpatialQuery(空間検索)表示画面
SpatialQuery(空間検索)formの表示して、検索対象のShape fileのLayernameを選択します。
検索対象のShape fileの表示
SpatialQuery(空間検索)formの表示して、検索方法を選択します。
検索方法の表示
SpatialQuery(空間検索)formの表示して、選択するShape fileのLayernameを選択します。
選択するShape fileの表示
SpatialQuery(空間検索)formの表示して、パラメータの設定が終了したところ。
ここでは、「c14_regionDDにc14_reailroadが交差しているShape featureを探せ」と言うstatementになります。
パラメータの設定完了の表示
SpatialQuery(空間検索)実行すると、Main Form上のMapで検索結果が選択状態となります。
ここでは、29個のShape featureが検索されました。神奈川県内で鉄道の交差している市町村を抽出したことになります。
SpatialQuery(空間検索)の結果
再度条件を変えてSpatialQuery(空間検索)する場合は、Main form上のMapの選択状態を解除してから実行してください。
今回のまとめ
どうでしょうか? 簡単に作成できましたね。
では、今回のまとめを
-
SpatialQuery(空間検索)のcodeingの実装を行いました。
-
別Formを作成して、SpatialQuery(空間検索)の設定表示を行いました。
[Chapter 9]では、他のよく使いそうなGeoProcessingの作成してみたいと考えています。Intersect、Clip、Unionなどを考えています。
vb.net2010だけでなく、C#でも、visual studio2008でも動作することができます。
簡単に自前のソフトウェアにちょっとしたGIS機能を付け加えるには良いと思います。
ex093のsource codeを公開しますので、活用してください。
ただし、あくまでの自分用のサンプルですので、バグなどがある可能性が高いので、原文のままの使用は避けてください。
サンプルコードおよびサンプルデータを使って、お使いのPCの不具合が生じても一切責任は持てませんので、あくまでも自己責任にて使用してください。
最後に、Layerを選択して次の操作を行うことを忘れないように。
Exercise
今回のProgramを少し発展させて以下の項目を付け加えてみてください。
-
選択したShape featureだけにSpatialQuery(空間検索)できるようにcodeを追加する。
-
他のGeoProcessingに挑戦してみる。MapWinGIS Activex GeoProcessingを参考にしてください。
Comments are closed.