凡例の作成example [Chapter 4]

凡例の作成example

さて、いよいよ本格的にMapWInGISのプログラムを作成する準備が整いました。
操作性の良いGISソフトウェアを作成していきましょう。

[Chapter 4]から見ている方は、
順番に、

で勉強してください。

今回は、凡例(legend)のexampleを作成します。
ArcGISやQGISやMapWindowでTOC(Table of Contents)に当たる部分についてcodingします。

blog.godo-tys.jp_wp-content_gallery_mapwingis_ex04_image01.jpg
MapWindowのTOCの赤枠内にLayerとtoolが登録されています。

いままでは、treeview controlを使ってきましたが、layerの入れ替えや、表示・非表示やlayer名の変更などが簡単にできませんでした。 GISのprogramを作成するのですから、余計なcodingやcontrolの使い方で四苦八苦する必要はありません。

まずは、凡例のLegendControlを登録しましょう。
MapWindowをインストールしたフォルダーにあります。

MapWinInterfaces.dllの登録

visual basic2010の新規projectでmapwingis_ex04を作成します。

ツールボックスにまずは登録します。
アイテムの選択→.Net Framework コンポーネントのtab→参照ボタンをクリックして、MapWinInterfaces.dllを登録します。
MapWinInterfaces.dllの場所はdefaultではC:¥Program Files¥MapWindowにあります。
MapWinInterfaces.dllを登録すると、名前がLegend、名前空間がLegendControlが下記のように表示されます。

blog.godo-tys.jp_wp-content_gallery_mapwingis_ex04_image02.jpg
MapWinInterfaces.dllの登録

またツールボックスには、Map Control とLegendが追加されているはずです。
blog.godo-tys.jp_wp-content_gallery_mapwingis_ex04_image03.jpg
MapWInGISタブに登録

はい、これで準備OKですね。

Program Coding

まずは、From designをして、Codingします。

Form Design

Form designはiconを使ってtoolbarにsettingします。
こんな感じ、
blog.godo-tys.jp_wp-content_gallery_mapwingis_ex04_image04.jpg
Form Design

AxMap1のプロパティの変更
CursorMode → cmNone
MapUnits → umDecimalDegrees (サンプルの神奈川県のshape fileがJGD2000世界測地系)
SendMouseDown → True
SendMouseMove → True
SendMouseUp → false

ここで、mouse eventを利用するには、必ずSendMouse~~をtrueにしてください。falseではeventを捕まえることができません。

Legend controlも配置します。いままでtreeview controlを配置していた場所にLegend1を配置します。

後は、基本的に[Chapter 3-2]と同様な感じにdesignします。

Coding

それでは、Legend Controlが配置できれば、codingを始めていきます。

Form1 load時の処理

まずは、LegendとMap Controlを関連づけます。その記述をFrom load時の追加します。

    Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        '**Initialize the legend control**
        Legend1.Map = DirectCast(AxMap1.GetOcx(), MapWinGIS.Map)
    End Sub

この1行がないと動きません。
おまじないとでも考えておいてください。

Add Layersの変更

toolbarにAdd layersとRemove layerを配置します。
blog.godo-tys.jp_wp-content_gallery_mapwingis_ex04_image05.jpg
toolbar

ex04でのAdd Layersはshape fileだけを読み込んで表示するようにします。

    Private Sub AddLayer()
        Dim shpfile As MapWinGIS.Shapefile
        Dim openDlg As OpenFileDialog = New OpenFileDialog()
        Dim handle As Integer
        Dim ext As String = ""
 
        'initialize dialog
        openDlg.Filter = "Supported Formats|*.shp|Shapefile (*.shp)|*.shp"
        openDlg.CheckFileExists = True
 
        If (openDlg.ShowDialog(Me) = DialogResult.OK) Then
 
            'get the extension of the file
            ext = System.IO.Path.GetExtension(openDlg.FileName)
 
            If ext = ".shp" Then
 
                shpfile = New MapWinGIS.ShapefileClass()
 
                'open the shapefile
                Dim blmCheck As Boolean = shpfile.Open(openDlg.FileName)
 
                ''add the shapefile to the map
                'handle = AxMap1.AddLayer(shpfile, True)
 
                'add the shapefile to the map and legend
                handle = Legend1.Layers.Add(shpfile, True)
 
                AxMap1.Redraw()
 
                'set the layer name
                Legend1.Map.LayerName(handle) = System.IO.Path.GetFileNameWithoutExtension(shpfile.Filename)
 
            End If
        End If
    End Sub

基本的には、ex01,ex02と同じ処理ですが、下記1行が違いますね。

handle = Legend1.Layers.Add(shpfile, True)

以前はAxMap1にlayerを追加していたのですが、今回はLegen1のlayerに追加します。
こうすることで、LegendからAxMapへ処理が渡されれます。
MapWinInterfaces.dllを使う場合は、このようにlegendのmethodやpropertyを設定することになります。

Remove Layerの追加

追加したlayerを削除してみます。
これも、Legendから実行します。

    Private Sub ToolStripButton2_Click(sender As System.Object, e As System.EventArgs) Handles ToolStripButton2.Click
        'Remove Layer
        Legend1.Layers.Remove(Legend1.SelectedLayer)
        Legend1.Refresh()
    End Sub

Legend1で選択したlayerのみを削除します。

Legend1のevent処理

Legend1のeventはたくさんありますので、いろいろと試しください。
今回は、Layerが選択された時のevent処理を実装します。

#Region "Legend Eevnt"
 
    Private Sub Legend1_LayerSelected(Handle As System.Int32) Handles Legend1.LayerSelected
        'saves the group handle of the active group
        If Handle >= 0 Then
            layerHandle = Handle
            ToolStripStatusLabelLayer.Text = Legend1.Map.LayerName(Handle)
        End If
    End Sub
#End Region

引数HandleにlayerのHandle(ユニーク値)が取得できます。
LayerHandleはPrivateで宣言しているので、引数Handleを代入します。
これで、現在選択したLayerのHandle値が取得できます。

変数の宣言

ex04で使用するprivate宣言の変数です。

    Private ZoomExtents As New ArrayList
    Private ZoomLevel As Integer
    Private ZoomingLevels As Boolean = False
    Private chkAction As String
 
    Private layerHandle As Integer

Programの実行

では、ex04を保存して実行してみましょう。
ex01、ex02、ex03では読み込んだ順にlayerが固定されて、上下関係が固定されていましたが、LegendControlを使うことで、後で並び替えることができます。

blog.godo-tys.jp_wp-content_gallery_mapwingis_ex04_image06.jpg
神奈川県のサンプルshape fileの表示

次に、layerの移動をしてみましょう。

  1. 移動したいlayerをlegend1上で選択します。
  2. statusbarlabelに選択したlayer名が表示されます。
  3. 選択後、mouse dragdropすることでlayerの位置関係を変更することができます。

blog.godo-tys.jp_wp-content_gallery_mapwingis_ex04_image07.jpg
layerの移動

layerの非表示は、legend1のlayerのoffにすることで非表示となり、onすると表示されます。
blog.godo-tys.jp_wp-content_gallery_mapwingis_ex04_image08.jpg
Layerの表示・非表示

Layerの削除をしてみましょう。

  1. 削除したいlayerをlegend1上で選択します。
  2. statusbarlabelに選択したlayer名が表示されます。
  3. Remove layerをクリック

これで、特定のlayerを削除できます。
blog.godo-tys.jp_wp-content_gallery_mapwingis_ex04_image09.jpg
layerの削除後

今回のまとめ

  1. LayerのHandle値は0から始まる。
  2. LegendControlを使ってlayerの操作の実装を行いました。
  3. LegendControlのevent処理の実装を行いました。

LegendControlを使うことで、Layerの操作が非常に簡単にできることがわかりました。
今後は、LegendControlを使いながら、programの実装を行っていきます。
MapWindowをインストールするとこのLegendControlやMapUtilityのdllを使うことができますので、非常に強力なGISアプリケーションを作成することができます。

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

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

Exercise

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

  1. Add Layerにraster fileも選択でいるように修正してみる。
  2. LegendControlのevent処理を追加してみる。
  3. shape file読み込み表示のColor schemeを変更してみる。

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

 

WP-SpamFree by Pole Position Marketing

Social Widgets powered by AB-WebLog.com.