MapWinGIS-エクセルでGIS
今回は、”エクセルでGIS”と題してMapWinGIS(OSS)を利用してみようと思います。
MapWinGISとは
MapWinGISとは、MapWindowプロジェクトが開発しているOSSの一つで、地図を表示するソフトウェア部品です。提供形態は、ActiveXコントロール(ocxとかCOMなどと呼びますが、本記事ではocxに統一)となっており、.NET系(C#やVB.NET)やDelphiなどの言語から利用することができます。
[blogcard url=”https://www.mapwindow.org/”]
MapWinGISには様々な機能がありますが、代表的なものとしてはシェープファイルの読み書きやXYZTileの表示があります。
今回は、エクセルシートにMapWinGISのコントロールを貼り付けてVBAにて制御し、OpenStreetMap地図を表示するプログラムを作成したいと思います。完成イメージは、以下になります。

画面左のOSMボタンを押下するとOpenStreetMapのタイル地図が表示され、GSIボタンを押下すると地理院タイル(標準)が表示されます。
MapWinGISのインストール
それではMapWinGISをインストールしましょう。
1.インストール媒体のダウンロード
下記サイトからインストール媒体をダウンロードします。
https://github.com/MapWindow/MapWinGIS/releases
今回は下記2種類で動作確認しましたが、32ビット版の方が確実に動くと思います。
MapWinGIS-only-v5.1.1-Win32-VS2015.exe
MapWinGIS-only-v5.1.1-x64-VS2015.exe
2.インストールの実施
ダウンロードしたファイルをダブルクリックしてインストールします。
インストールは、デフォルトの指定のままインストールしても特に問題ありません。インストールしたフォルダーは記録しておいてください。
インストール完了時の画面を以下に示します。

エクセルの設定
MapWinGISがインストールできたらエクセル側の設定を行います。
1.参照設定の追加
リボンメニューの[開発]タブを指定し画面左の[Visual Basic]ボタンを押下すると、VBAのコード編集画面が表示されます。その画面から[ツール]、[参照設定]を選択します。

表示された参照設定画面にて”参照”ボタンを押下し、インストール時に記録したフォルダから以下のファイルを指定します。
MapWinGIS.ocx
指定後の参照設定画面は以下のようになります。

(参考)[開発]タブの表示方法
開発タブは、[ファイル]タブから[オプション]、[リボンのユーザー設定]を選択し、画面右の[メインタブ]の”開発”チェックボックスをONにすると表示されます。

2.フォームコントロールの確認
次に、エクセルに挿入可能なActiveXコントロールとしてMapWinGISのocxが追加されていることを確認します。
作業としては、[開発]タブから”挿入”ボタンを押下し、”Activexコントロール”の”コントロールの選択”(工具アイコン)を指定します。

表示される”コントロールの選択”画面にて、以下が追加されていれば準備完了です。
Map Control

プログラムの作成
ではプログラム作成作業に入りましょう。作業手順は以下の通りとなります。
1.エクセルシートにMapControlを張り付け
2.ソースコードの作成
3.ボタンの作成と呼び出し関数の設定
4.動作確認
1.エクセルシートにMapControlを張り付け
先ほど表示した”コントロールの選択”画面から”Map Control”を選択してOKボタンを押下すると、マウスカーソルがプラス(+)状態となりますので、そのままエクセルシート上でドラッグ操作を行います。
すると下図のようにMapWinGISのocxがシートに張り付けられ(埋め込められ)ます。コントロールを右クリックしてプロパティを指定するとオブジェクト名などが確認できます。(オブジェクト名は、Map1)

2.ソースコードの作成
VBAのソースコードの作成には、いくつかの方法がありますが、今回はマクロの作成と同様の方法で作成します。
作業としては、[開発]タブから”マクロ”ボタンを押下し、マクロ名”osm”を入力して”作成”ボタンを押下します。

すると、VBA編集画面に関数の開始と終了が表示されますので、以下のコードを貼り付けます。
Sub osm()
'レイヤ情報のクリア
Sheet1.Map1.RemoveAllLayers
'プロバイダ情報の設定
Sheet2.Map1.Projection = PROJECTION_WGS84
Sheet1.Map1.TileProvider = OpenStreetMap
Sheet1.Map1.Tiles.ProviderId = tkTileProvider.OpenStreetMap
'表示位置、ズームレベルの設定(皇居周辺)
Sheet1.Map1.Latitude = 35.677182
Sheet1.Map1.Longitude = 139.752692
Sheet1.Map1.CurrentZoom = 10
'マウスモードをパンに設定
Sheet1.Map1.CursorMode = cmPan
End Sub
ソースコードの説明をします。
基本的には、コントロールMap1に対して地図配信プロバイダなどのプロパティ設定を行っているだけです。
4行目でレイヤ情報の削除、7~9行目で座標系とプロバイダ情報の設定を行っています。
続いて12~14行目で中心座標とズームレベルを設定し、17行目でマウスモードの設定(今回はパン)を行っています。
3.ボタンの作成と呼び出し関数の設定
次に、先ほど作成した関数(マクロ)呼び出し用のボタンを追加します。
[開発]タブから”挿入”ボタンを選択し、[フォームコントロール]の”ボタン”を選択します。

選択後マウスがプラスマーク(+)となるので、シート上をドラッグするとボタンが作成され、”マクロの登録”画面が表示されます。
画面に表示されているマクロ”osm”を指定してOKボタンを押下すれば準備完了です。

4.動作確認
先ほど作成したボタンを押下すると、コントロールMap1に地図が表示されます。(初回は少し時間がかかります)
マウスはパンニング状態に設定したので、ドラッグスクロールとホイールによる拡大/縮小ができます。
おまけ
以下のプログラムにて、地理院地図を表示できます。
Sub gsi()
'レイヤ情報のクリア
Sheet1.Map1.RemoveAllLayers
'プロバイダ情報のクリア(キャッシュは残す)
Sheet1.Map1.Tiles.Providers.Clear (True)
'プロバイダ情報の追加(その他プロバイダーとしてGSIを設定)
If Sheet1.Map1.Tiles.Providers.Add( _
tkTileProvider.ProviderCustom, _
"OSMmaps/std", _
"https://cyberjapandata.gsi.go.jp/xyz/std/{zoom}/{x}/{y}.png", _
SphericalMercator, _
1, _
18) Then
Else
'初期化失敗時はダイアログを表示して終了
MsgBox ("初期化失敗")
Exit Sub
End If
'プロバイダ情報の設定
Sheet2.Map1.Projection = PROJECTION_WGS84
Sheet1.Map1.TileProvider = ProviderCustom
Sheet1.Map1.Tiles.ProviderId = tkTileProvider.ProviderCustom
'表示位置、ズームレベルの設定(皇居周辺)
Sheet1.Map1.Latitude = 35.677182
Sheet1.Map1.Longitude = 139.752692
Sheet1.Map1.CurrentZoom = 10
'マウスモードをパンに設定
Sheet1.Map1.CursorMode = cmPan
End Sub
プログラムを説明をすると、7行目でプロバイダー情報をクリアし、10~16行目でプロバイダーとして地理院タイルを指定して、24~26行目でカスタムプロバイダーを指定しています。
実行すると、以下のように地理院タイルが表示されます。

まとめ
ここまで、以下を学習しました。
- MapWinGISのインストール
- MapWinGISをエクセルシートへの張り付けとOSMおよび地理院タイルの表示
- MapWinGISのマウスモードの切り替え(パンとズーム)
MapWinGISは、XYZタイルをサポートしたことにより、手軽にデモなどを作成できると思いますし、機能のあまりないGISへの適用や社内のテストツールとしても利用可能かと思います。