さらに見栄えのする地図になるように、様々なレイヤを追加していきます。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倍にしています。