「DotSpatial」SVGシンボルの表示について
「Dotspatial」では、ポイントシンボルに画像ファイルが利用できるが、
ベクター画像であるsvgが利用できない。
一方、フリーのオープンソースである「QGIS」ではsvgが利用できることから 「Dotspatial」でも、svgが利用できるよう改訂する。以下は表示イメージ
1.SVGライブラリの利用
.Net Frameworkでは、svgが利用でいないため、以下のSVGライブラリをDLし、Svg.dllを参照登録しておく。
SVG Rendering Engine
2.SVGファイルを開く
標準のポイントシンボルのクラスでは、拡張子がsvgのファイルは開いてくれないので
新たにポイントシンボルクラスを作成し、拡張子がsvgのファイルが開くよう修正。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public partial class CustomPictureSymbolControl { // 途中省略 /// /// ファイルを開くボタンクリック時に呼ばれます /// ///ファイルを開くボタン ///イベントデータ private void buttonEdit1_Properties_Click(object sender, EventArgs e) { var ofd = new OpenFileDialog(); ofd.Filter = "Image Files|*.png;*.svg;*.jpg;*.gif;*.tif;*.ico"; if (ofd.ShowDialog() == DialogResult.OK) { this.txtImagePath.EditValue = ofd.FileName; this.OnEditValueChanged(); } } } |
3.PictureSymbolの拡張クラスを作成
画像ファイルを利用するポイントシンボルのクラスは、PictureSymbolが使われているが、
そのままだと、svgファイル読み込み時にエラーが発生してしまうので、拡張クラスを作成し、
ファイル名プロパティと、画像描画のメソッドを新たに作成する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
public class CustomPictureSymbol : PictureSymbol, IPictureSymbol { private string imageFilename; private SvgDocument svgdoc; protected override void OnDraw(Graphics g, double scaleSize) { if (this.svgdoc != null) { base.Image = this.svgdoc.Draw((int)Size.Width, (int)Size.Height); } base.OnDraw(g, scaleSize); } /// /// Gets or sets the string image fileName to use /// [Serialize("ImageFilename")] public new string ImageFilename { get { if (Path.GetExtension(this.imageFilename) == ".svg") { return this.imageFilename; } else { return base.ImageFilename; } } set { this.imageFilename = value; if (Path.GetExtension(this.imageFilename) == ".svg") { this.svgdoc = SvgDocument.Open(this.imageFilename); } else { this.svgdoc = null; base.ImageFilename = value; } } } } |