凡例の作成example
さて、いよいよ本格的にMapWInGISのプログラムを作成する準備が整いました。
操作性の良いGISソフトウェアを作成していきましょう。
[Chapter 4]から見ている方は、
順番に、
で勉強してください。
今回は、凡例(legend)のexampleを作成します。
ArcGISやQGISやMapWindowでTOC(Table of Contents)に当たる部分についてcodingします。
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が下記のように表示されます。
またツールボックスには、Map Control とLegendが追加されているはずです。
MapWInGISタブに登録
はい、これで準備OKですね。
Program Coding
まずは、From designをして、Codingします。
Form Design
Form designはiconを使ってtoolbarにsettingします。
こんな感じ、
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を配置します。
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を使うことで、後で並び替えることができます。
次に、layerの移動をしてみましょう。
-
移動したいlayerをlegend1上で選択します。
-
statusbarlabelに選択したlayer名が表示されます。
-
選択後、mouse dragdropすることでlayerの位置関係を変更することができます。
layerの非表示は、legend1のlayerのoffにすることで非表示となり、onすると表示されます。
Layerの表示・非表示
Layerの削除をしてみましょう。
-
削除したいlayerをlegend1上で選択します。
-
statusbarlabelに選択したlayer名が表示されます。
-
Remove layerをクリック
今回のまとめ
-
LayerのHandle値は0から始まる。
-
LegendControlを使ってlayerの操作の実装を行いました。
-
LegendControlのevent処理の実装を行いました。
LegendControlを使うことで、Layerの操作が非常に簡単にできることがわかりました。
今後は、LegendControlを使いながら、programの実装を行っていきます。
MapWindowをインストールするとこのLegendControlやMapUtilityのdllを使うことができますので、非常に強力なGISアプリケーションを作成することができます。
vb.netd2010だけでなく、C#でも、visual studio2008でも動作することができます。
簡単に自前のソフトウェアにちょっとしたGIS機能を付け加えるには良いと思います。
参考として、source code sampleをアップしておきます。
ただし、あくまでの自分用のサンプルですので、バグなどがある可能性が高いので、原文のままの使用は避けてください。
サンプルコードを使って、お使いのPCの不具合が生じても一切責任は持てませんので、あくまでも自己責任にて使用してください。
Exercise
今回のProgramを少し発展させて以下の項目を付け加えてみてください。
-
Add Layerにraster fileも選択でいるように修正してみる。
-
LegendControlのevent処理を追加してみる。
-
shape file読み込み表示のColor schemeを変更してみる。
最近のコメント