前回、シンプルな日本地図の表示方法を紹介しましたが、今回はより使いやすい地図アプリケーションになるように機能を拡張していきます。

ズームの設定

まず、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メソッドを呼び出しています。

ズームしたり地図の中心地点を変更。ズームを自由に変更でき、地図の中心位置が変わっていることがわかります。