前回、シンプルな日本地図の表示方法を紹介しましたが、今回はより使いやすい地図アプリケーションになるように機能を拡張していきます。
ズームの設定
まず、TrackBarコントロールのScrollイベントに次のプログラムを追加して、スクロールでズームサイズを変更するようにします。
リスト5 Form1.cs抜粋 - トラックバーの値に応じてズームサイズを設定
//トラックバーの値をスクロールした時のイベント
private void trbZoom_Scroll(object sender, EventArgs e)
{
//倍率をバーの目盛に応じて拡大(縮小)
_Map.Zoom = _BaseZoom / Math.Pow(2, trbZoom.Value);
picJapan.Image = _Map.GetMap();
}
ズームの度合いを変更するには、MapクラスのZoomプロパティを設定します。Zoomプロパティはdouble型で、数字を大きくするほど広く、数字を小さくするほど詳細を表示できます。ここでは、日本全体を表示した時のZoomプロパティの値を_BaseZoom変数に保存しているため、_BaseZoom変数とTrackBarコントロールのValueプロパティからズーム率を計算しています。なお、Math.Powメソッドは累乗を計算する関数で、トラックバーの目盛が0の場合は日本全体、目盛が1の場合は2倍ズーム、目盛が2の場合は4倍ズーム(以降2倍の繰り返し)を算出しています。
地図の中央位置を設定
続けて、PictureBoxコントロールのMouseClickイベントに次のプログラムを追加して、クリックした場所を地図の中央に表示するようにします。
リスト6 Form1.cs抜粋 - 地図のクリックした場所を、地図の中心に設定
//ピクチャボックスでマウスをクリックした時のイベント
private void picJapan_MouseClick(object sender, MouseEventArgs e)
{
//クリックした場所を地図の中央に設定
SharpMap.Geometries.Point p = _Map.ImageToWorld(new PointF(e.X, e.Y));
_Map.Center.X = p.X;
_Map.Center.Y = p.Y;
picJapan.Image = _Map.GetMap();
}
地図の表示場所を指定するには、MapクラスのCenterプロパティを設定します。CenterプロパティはX、Yといった座標を持ち、地図の中心位置を設定できます。SharpMapでの座標はSharpMap.Geometries.Pointクラスで表現されるため、ピクチャボックスのクリック位置と変換するために、MapクラスのImageToWorldメソッドを呼び出しています。