Category Archives: vb.net - Page 10

簡単なGeoProcessingのexample [Chapter 9-3]

簡単な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そのまんまですね。
こんな感じ、

blog.godo-tys.jp_wp-content_gallery_mapwingis_ex09_image01.jpg
ToolStripContainerを使って、ToolStripbarを追加しています。

次に、空間検索の設定formを作成します。

空間検索の設定Form

Main Formから呼び出す空間検索の設定Form designはこんな感じ、

blog.godo-tys.jp_wp-content_gallery_mapwingis_ex093_image02.jpg
SpatialQueryの設定Form

Coding

それでは、空間検索の設定Form(frmSpatialQuery)からcodingを始めていきます。
空間検索の設定で必要なデータは、

  1. 検索対象のShape file
  2. 選択するためのShape file
  3. 検索方法

が必要になります。

frmSpatialQuery load時

まずは、参照の追加で、

  1. MapWinUtility.dll
  2. 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から設定します。
blog.godo-tys.jp_wp-content_gallery_mapwingis_ex093_image10.jpg
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(空間検索)の大まかな流れは、

  1. 変数類のチェック
  2. SelectByShapefile
  3. 検索結果からshapeをselect
  4. Main FormのMapのShapeを選択状態にする

となります。

SpatialQuery(空間検索)のStatementは、
SelectByShapefile(rl_sf, CType(cmbRelation.SelectedIndex, MapWinGIS.tkSpatialRelation), False, ShapeIDs)です。
検索結果のShapeIndexがShapeIDs objectに格納されます。

詳細は、MapWinGIS Activex GeoProcessingを参考にしてください。

空間検索で使うSelectByShapefileを抜粋すると、
blog.godo-tys.jp_wp-content_gallery_mapwingis_ex093_image09.jpg
となっています。

このSpatialQuery(空間検索)の設定Formを次のMain Formから呼び出します。

Main Formのcodeing

blog.godo-tys.jp_wp-content_gallery_mapwingis_ex093_image01.jpg
SpatialQuery(空間検索)の設定のbutton

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(空間検索)を表示させます。
blog.godo-tys.jp_wp-content_gallery_mapwingis_ex093_image03.jpg
SpatialQuery(空間検索)表示画面

SpatialQuery(空間検索)formの表示して、検索対象のShape fileのLayernameを選択します。
blog.godo-tys.jp_wp-content_gallery_mapwingis_ex093_image04.jpg
検索対象のShape fileの表示

SpatialQuery(空間検索)formの表示して、検索方法を選択します。
blog.godo-tys.jp_wp-content_gallery_mapwingis_ex093_image05.jpg
検索方法の表示

SpatialQuery(空間検索)formの表示して、選択するShape fileのLayernameを選択します。
blog.godo-tys.jp_wp-content_gallery_mapwingis_ex093_image06.jpg
選択するShape fileの表示

SpatialQuery(空間検索)formの表示して、パラメータの設定が終了したところ。
ここでは、「c14_regionDDにc14_reailroadが交差しているShape featureを探せ」と言うstatementになります。
blog.godo-tys.jp_wp-content_gallery_mapwingis_ex093_image07.jpg
パラメータの設定完了の表示

SpatialQuery(空間検索)実行すると、Main Form上のMapで検索結果が選択状態となります。
ここでは、29個のShape featureが検索されました。神奈川県内で鉄道の交差している市町村を抽出したことになります。
blog.godo-tys.jp_wp-content_gallery_mapwingis_ex093_image08.jpg
SpatialQuery(空間検索)の結果

再度条件を変えてSpatialQuery(空間検索)する場合は、Main form上のMapの選択状態を解除してから実行してください。

今回のまとめ

どうでしょうか? 簡単に作成できましたね。

では、今回のまとめを

  1. SpatialQuery(空間検索)のcodeingの実装を行いました。
  2. 別Formを作成して、SpatialQuery(空間検索)の設定表示を行いました。

[Chapter 9]では、他のよく使いそうなGeoProcessingの作成してみたいと考えています。Intersect、Clip、Unionなどを考えています。

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

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

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

Exercise

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

  1. 選択したShape featureだけにSpatialQuery(空間検索)できるようにcodeを追加する。
  2. 他のGeoProcessingに挑戦してみる。MapWinGIS Activex GeoProcessingを参考にしてください。

Social Widgets powered by AB-WebLog.com.