作者:幸福-一路向南_654 | 来源:互联网 | 2023-09-24 08:30
做gis的朋友对地图符号并不陌生,地图上的各种要素正是由于有了符号而变得绚丽多彩。我这里要说的符号是指的点符号。用过mo、ae、等gis平台做二次开发的都知道,在设置点状要素symbol的时
做gis的朋友对地图符号并不陌生,地图上的各种要素正是由于有了符号而变得绚丽多彩。我这里要说的符号是指的点符号。
用过mo、ae、等gis平台做二次开发的都知道,在设置点状要素symbol的时候,都有一种symbol类型为truetype symbol,有一个font的属性来指定truetype字体,并有一个charactorIndex的属性用来指定符号的索引号,通过这两个属性即可得到一个符号。相对应,在arcgis桌面软件中,有个点状符号选择工具,能够将指定字体中的所有符号列出来,让用户去选择合适的符号。
之前我对如何实现这种功能查阅了大量的资料,但是收获甚微//,大多数的资料所做的努力都是从字体文件中提取字模。前几天有事需要查ascii码表的时候,再对照之前所看到的符号,发现两者竟是同一套东西,只是两套不同的表现方式而已。
可以这么理解,ascii码中的字符(比如97代表‘a’,'a'就是ascii中的一个字符)通过不同的字体来表现,得到的就是不同的符号了,这其中的原理还不是很清楚,但是知道了这些已经不妨碍我们做出一个完美的符号选择器了。
实现方式有两种,但这两种方式的本质是一样的。第一种方式实现起来非常简单,也很好控制,最好在仅仅展现符号的情况下使用,但不能表现出很丰富的效果来。第二种方式通过GDI+来实现,通过提取每个符号的字模(即符号轮廓)为路径,可以实现很多的高级展现功能,也可将提取出来的路径直接用在地图上,和地图要素集一起进行绘制。
//第一种实现方式
Label[] labSymbols = new Label[256];
for(int i = 0; i <256; i++)
{
labSymbols[i].FOnt= #你指定的字体#;
labSymbols[i].Text = new string(Convert.ToChar(i), 1);
}
///第二种实现方式
private void DrawCharactorsOutLines(ref Graphics g)
{
System.Drawing.Drawing2D.GraphicsPath oOutline = new System.Drawing.Drawing2D.GraphicsPath();
int iSymbolIndex = 0;
g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
for (int i = 0; i <16; i++)
{
for (int j = 0; j <16; j++)
{
string sCharactor = new string(Convert.ToChar(iSymbolIndex++), 1);
oOutline = new System.Drawing.Drawing2D.GraphicsPath();
oOutline.AddString(sCharactor, this._curFont.FontFamily, (int)FontStyle.Regular, this._fontSize - 7, new Point(j * this._fontSize, i * this._fontSize), StringFormat.GenericDefault);
g.FillPath(new SolidBrush(Color.Black), oOutline);
oOutline.Dispose();
}
}
}
上面都是用C#写的示例代码,我已经写好了一个完整的符号选择控件,如有需要,可以和我联系。
(转自:http://blog.163.com/lionyue@126/blog/static/10793071200801935736483/)