さらに見栄えのする地図になるように、様々なレイヤを追加していきます。Form_Loadイベントの「_Map.Layers.Add(baseLayer);」の後に追加していきます。

河川を表すレイヤを追加

まず、河川に関するレイヤを追加します。

リスト7 Form1.cs抜粋 - 複数のレイヤを登録


    _Map.Layers.Add(baseLayer);
    //(2)河川を表すレイヤ
    VectorLayer riverLayer = new VectorLayer("河川");
    riverLayer.DataSource = new ShapeFile(@"..\..\ShapeFiles\hydrol_1_1.shp");
    riverLayer.Style.Line = new Pen(Color.Aqua,1.5f);
    _Map.Layers.Add(riverLayer);

Layersプロパティには複数のレイヤを登録することができますが、一番下に表示したいレイヤを最初に、一番上に表示したい項目を最後に追加します。ここでは、行政区域のデータを先に登録し、河川のデータを後で登録しています。なお、レイヤを増やしていくと描画に時間がかかるため、必要に応じてカーソルを砂時計にするなどの制御を行うと良いでしょう。

またスタイルの設定方法ですが、行政区域レイヤは面データだったため、Fill/EnableOutline/Outlineプロパティで色を反映させましたが、河川レイヤは線データのためLineプロパティで設定しています。なお、点データではFillプロパティで反映させることができます。

文字(市町村名)を表すレイヤを追加

行政区域のシェープファイル(bnda_1_1.shp)には、市町村名を示す文字データも格納されています。この文字データを表示するレイヤを追加します。

リスト8 Form1.cs抜粋 - 文字情報を表示するらラベルレイヤを登録


    //(3)市町村名を表すラベルレイヤ
    LabelLayer lblLayer = new LabelLayer("市町村名");
    lblLayer.DataSource = baseLayer.DataSource;
    lblLayer.LabelColumn = "laa"; //LAA属性
    lblLayer.Style.CollisionDetection = true; //衝突検知
    lblLayer.Style.CollisionBuffer = new SizeF(25, 25); //衝突幅
    lblLayer.Style.Font = new Font("MS ゴシック", 9); //フォント
_Map.Layers.Add(lblLayer);

文字データを表示する時には、VectorLayerではなくLabelLayerを使用します。シェープファイル内に「laa」という属性名で市町村名が登録されているため、LabelColumnプロパティに「laa」をセットします。 LabelLayerのスタイルでは、フォントを設定できます。また、ラベルで地図が埋めつくされてしまわないようにCollisionDetectionプロパティを設定します。このプロパティをtrueに設定すると、ラベル同士の衝突を検知することができます。このラベルの重複間隔はCollisionBufferプロパティで調整できます。

市町村名レイヤを重ねた地図

独自の点や線を表示するレイヤを追加

最後に、独自の点と線を追加してみます。独自の地図データを作るには、Geometryクラスのコレクション(System.Collections.ObjectModel.Collection)とGeometryProviderクラスを利用します。

リスト9 Form1.cs抜粋 - 独自の点と線を表示するレイヤを登録


    //(4)地点と子午線を表すレイヤ
    VectorLayer orgLayer = new VectorLayer("子午線");
    Collection geoCol = new Collection();
    //東経135度、北緯35度の点を追加
    geoCol.Add(new SharpMap.Geometries.Point(135, 35));
    //東経135度、北緯33度~47度の線を追加
    Collection points 
        = new Collection();
    points.Add(new SharpMap.Geometries.Point(135, 33));
    points.Add(new SharpMap.Geometries.Point(135, 37));
    geoCol.Add(new SharpMap.Geometries.LineString(points));
    //レイヤの作成とスタイルの設定
    orgLayer.DataSource = new GeometryProvider(geoCol);
    orgLayer.Style.Line = new Pen(Color.Purple,1);
    orgLayer.Style.SymbolScale = 1.5f;
    _Map.Layers.Add(orgLayer);

まず東経135度、北緯35度を表すPointクラスと、2点間を結ぶLineStringクラス(東経135度、北緯33度~47度)を生成しています。それぞれGeometryクラスのコレクションに登録します。 次に、レイヤのDataSourceプロパティを設定します。シェープファイルではなく、Geometryクラスのコレクションを読み込むため、GeometryProviderクラスを利用します。 これまで同様、レイヤのスタイルも設定できます。線のスタイルはLineプロパティで設定できます。点のスタイルは、Symbol~で始まるプロパティにて設定できます。ここでは、SymbolScaleプロパティを使って点を表す図形を1.5倍にしています。

独自の線と点を重ねた地図