MapWinGIS-エクセルでGISその2
前回は、エクセル上でMapWinGISを動作させましたが、今回はもう少し体系的に学習しましょう。具体的には、オンラインドキュメントを確認しながら簡単なプログラムを作成します。
今回作成するプログラム
今回作成するプログラムの仕様を以下に列挙します。
- Mapコントロール上にOSM地図を表示(前回と同じ内容)
- シェープファイルをMapコントロール上にドロップ
- OSM地図上にシェープファイルを重ね合わせ
- 使用するシェープファイルは、ESRIジャパンが配布している日本市区町村界データ
- 塗りつぶし色や線幅などのパラメータはシートから取得する
完成イメージは、以下となります。
OSM地図の上に、市区町村界ポリゴンが以下の属性で表示されています。
・塗りつぶし色:緑色の半透明
・線色:赤
MapWinGISのドキュメント
今回は体系的に学習したいので、まずMapWinGISのオンラインドキュメントを確認しましょう。以下が最新版となります。
https://www.mapwindow.org/documentation/mapwingis4.9/
使用しているバージョンが5.1.1ですから、ちょっと古いかもしれませんが、今回の学習範囲であれば十分な内容です。
このサイトは、Doxygenで作成したドキュメントを公開しているわけですが、クラス図を指定すると該当クラスの仕様が表示できたり、右上の検索ボックスからメソッドやプロパティを検索できるなど、使い勝手は良いです。
また、主要なメソッドやプロパティにはサンプルもリンクされているので、大変参考になります。
ただ、少し残念なのは広告のせいで画面の縦が狭くなっていることです。広告は消しても再表示されるので、どうしようもありません。。
今回使用するメソッド、プロパティ
今回使用するメソッドやプロパティは以下となります。
- Mapコントロールへのファイルドロップイベント追加
- シェープファイルのオープン
- シェープファイルのポリゴンの塗りつぶし色や線色などの設定
- Mapコントロールへシェープファイルをレイヤとして追加
1.Mapコントロールへのファイルドロップイベント追加
Mapコントロールにファイルドロップ時のイベントがあるか確認しましょう。
方法は、先ほどご紹介した”MapWinGISのクラス全体像”からMapコントロールを意味する”Map”をクリックします。表示画面の下の方にMapコントロールの持つメソッドやプロパティが図として表示されますので、その中から”Events”をクリックします。
メソッドやプロパティ一覧から目的のものを探します。
これでイベントがわかりましたので、VBAにて実装します。
VBA編集画面にて、Mapコントロールを張り付けたシートを選択した状態で、コード編集画面の上部にてコントロール名”Map1”を選択します。右側のイベント一覧からFileDroppedを選択するとイベント呼び出し関数(引数がフルパスのファイル名)が作成されますので、必要な実装をします。
2.シェープファイルのオープン
次にドロップされたシェープファイルをオープンします。
先ほどと同様に、”MapWinGISのクラス全体像”からShapefileを指定し表示される一覧にOpenメソッドがあります。そのサンプル(C#)を表示すると、以下のようにシェープファイルのオープンからレイヤ追加までの流れがわかります。
内容を確認すると、Shapefileインスタンスを作成してOpenメソッドを呼び出し、MapコントロールにAddLayerメソッドで追加する流れのようです。
3.シェープファイルのポリゴンの塗りつぶし色や線色などの設定
この調子で、ポリゴンの表示属性も調べましょう。
”MapWinGISのクラス全体像”からShapefileの下にある”Visualization”をクリックします。すると、”ShapeDrawingOptions Class Reference”のページが開かれますので、その中の”Properties”の下に”FillColor”を確認します。サンプルもありますので内容を確認すると以下のようになっています。
Shapefileオブジェクトが持つDefaultDrawingOptionオブジェクトのプロパティに塗りつぶし色を設定するようです。
クラス図を確認すると、Shapefileオブジェクトが1つのDefaultDrawingOptionオブジェクトを保有しているようです。
4.Mapコントロールへシェープファイルをレイヤとして追加
Mapコントロールへのレイヤ追加は先ほど確認しました。
MapコントロールのメソッドとしてAddLayerがあり、引数としてShapefileインスタンスを引き渡します。
プログラムの作成
ここまでで調査が終わりましたので、あとはプログラム作成です。
環境設定などは前回の記事を参考にしてください。
1.OSM地図表示(標準モジュール)
プログラムの内容は、前回とほぼ同じです。
関数”osm_sheet2”を作成し、Sheet2に張り付けたコントロール名”Map1”にOSM地図を表示しています。
この関数をフォームコントロールに結び付けます。
Sub osm_sheet2()
'レイヤ情報のクリア
Sheet2.Map1.RemoveAllLayers
'プロバイダ情報のクリア(キャッシュは残す)
Sheet2.Map1.Tiles.Providers.Clear (False)
'OSMの表示を指定
Sheet2.Map1.Projection = PROJECTION_WGS84
Sheet2.Map1.TileProvider = OpenStreetMap
Sheet2.Map1.Tiles.ProviderId = tkTileProvider.OpenStreetMap
'表示位置、ズームレベルの設定(皇居周辺)
Sheet2.Map1.Latitude = 35.677182
Sheet2.Map1.Longitude = 139.752692
Sheet2.Map1.CurrentZoom = 10
'マウスモードをパンに設定
Sheet2.Map1.CursorMode = cmPan
End Sub
2.ファイルドロップイベント処理
ここが今回新規の部分になります。
Sheet2のMap1コントロールのイベント”Map1_FileDropped”に処理を記述します。
Private Sub Map1_FileDropped(ByVal Filename As String)
'シェープファイル用のインスタンスを生成しておく
Dim Shapefile As New MapWinGIS.Shapefile
Dim hndl As Long
'ドロップされたファイルをシェープファイルとしてオープン
If Shapefile.Open(Filename) Then
'ポリゴンの透過度、色の設定
Shapefile.DefaultDrawingOptions.FillTransparency = Cells(2, 10)
Shapefile.DefaultDrawingOptions.FillColor = RGB(Cells(2, 11), Cells(2, 12), Cells(2, 13))
'線の色と幅の設定
Shapefile.DefaultDrawingOptions.LineColor = RGB(Cells(3, 11), Cells(3, 12), Cells(3, 13))
Shapefile.DefaultDrawingOptions.LineWidth = Cells(4, 10)
'MapコントロールにShapefileインスタンスを追加
hndl = Sheet2.Map1.AddLayer(Shapefile, True)
Else
MsgBox ("Shapefile オープン失敗")
End If
End Sub
プログラムを説明します。
4行目でShapefileインスタンスを作成し、8行目でそのインスタンスを使ってシェープファイルをオープンします。シェープファイル名は、イベントの引数をそのまま使用します。
10~11行目でポリゴンの塗りつぶし色と透過を設定し、13~14行目で線幅と線色を設定します。設定値は、エクセルシートから取得するので、Cellsオブジェクトを使用しています。
最後に17行目でMapコントロールのAddLayerメソッドを使ってShapefileオブジェクトをレイヤとして追加すれば完了です。
動作確認
エクセルシート上の所定の場所に塗りつぶし色などを設定し、マクロ”osm_sheet2”を起動すると、OSM地図が表示されます。
その状態で、シェープファイル”japan_ver81.shp”を地図上にドロップすると以下の表示となります。
地図をマウスホイールで拡大すると、以下のような表示となります。
まとめ
ここまで、以下を学習しました。
- MapWinGISのオンラインマニュアルの見方
- Mapコントロールのファイルドロップイベント処理
- シェープファイルの取り扱い
GISのシステム構築や運用の業務では、シェープファイルの取り扱いが多いので、OSMと重ね合わせられるとデータの検証に使えて便利そうです。