广东省地图院 广东广州 510075
摘要:基于ArcEngine的接口进行二次开发,实现线型符号反走样绘图和对虚线的线型符号可以精确定义短线的长度和空白区的长度,突破ArcMap的线型定义瓶颈,提高基于基础地理信息制图效果与制图要求的正确性,大大减少后期人工处理的工作量。
关键词:反走样;GDI+;地图符号
1、引言
目前的地理信息平台为了提高地图渲染的效率,普遍基于像素运算进行地图绘图,不具备反走样绘图能力,线性对象的展现有锯齿,并且对线宽较小的线形对象无法达到肉眼可分辨的展示效果,输出的地图图形达不到制图要求,特别是在地图符号设计及地图符号配置阶段无法达到所见即所得的效果。
基于ArcMap的地图制图技术中,由于平台对虚线的线型符号的支持较弱,只能以固定比例表示连续性和间断性的长度,无法灵活处理。在制图要求中,某些河流或公路的符号为虚线,虚线由短线和点组成,短线的长度、空白区的长度都有严格的标准,但目前在ArcMap平台中无法精确定义其长度。
2、现状分析
2.1 ArcMap平台
ArcMap平台为了提高地图的渲染效率,不提供反走样绘图,线性对象的展现有锯齿,并且对线宽较小的线形对象无法达到肉眼可分辨的展示效果,屏幕输出的地图图形达不到制图要求,特别是在地图符号设计及地图符号配置阶段无法达到所见即所得的效果。
ArcMap对虚线线型符号支持较弱,常规的线型符号只能以固定比例表示连续性和间断性的长度,无法灵活处理。如果要精确定义短划线或者空白区的长度,还需要通过制图表达进行处理,工作量比较大,这对地图符号的设计非常的不方便,并且ArcMap的制图表达不支持反走样。
2.2 ESRI平滑插件
ESRI官方免费提供平滑线插件实现了线的平滑处理,但是不支持绘制圆弧、椭圆弧、贝塞尔曲线,对虚线的绘制也只能以固定比例表示连续性和间断性的长度,不能精确定义短划线和空白区的长度。
3、技术路线
通过重写ArcGIS底层接口ISymbol,调用GDI+绘制线型,利用GDI+平滑模式绘图,即通过设置SmoothingMode属性为AntiAlias,实现线型绘制的反走样。其中GDI+抗锯齿的原理是将图像边缘及其两侧的像素颜色进行混合,然后用新生成的具有混合特性的点来替换原来位置上的点以达到柔化物体外形、消除锯齿的效果。对于复杂的线型,采用线分层的思想,通过设置虚线绘制模板、线帽等属性以及定义线修饰符号,实现线型符号的绘制。流程图如下:
图1 技术流程
4、简单线型
实现线型符号反走样,可以设置线颜色、线宽、线帽、线连接方式。简单线型反走样的主要代码和说明如下:
1)重写ISymbol的SetupDC方法,获取屏幕或者其他输出设备的句柄和设置画笔。
void ISymbol.SetupDC(int hDC,ITransformation Transformation)
{
//获取设备的句柄
m_hdc = hDC;
m_transformation = Transformation;
//设置画笔
m_curPen = GetPenFromCurrentSymbol();
SetLineProperties(Transformation);
m_nonAntiLineSymbol = GetNonAntiLineSymbol();
m_nonAntiLineSymbol.SetupDC(m_hdc,m_transformation);
}
///设置画笔颜色、线宽、线帽、线连接方式
IRgbColor rgb = m_color as IRgbColor;
System.Drawing.Color c = System.Drawing.Color.FromArgb(rgb.Red,rgb.Green,rgb.Blue);
p.Color = c;
///设置线宽
IDisplayTransformation disTrans =(IDisplayTransformation)m_transformation;
//以Point为单位存储,在pagelayout中参照设备坐标变换
w =(distance / 72)* disTrans.Resolution;
//如果是在Map中,则要考虑参考比例尺及当前的显示比例
if(disTrans.ReferenceScale != 0)
w = w * disTrans.ReferenceScale / disTrans.ScaleRatio;
……
///设置线帽、线连接,根据IU选择的线帽、线连接赋值对应的参数
p.EndCap = System.Drawing.Drawing2D.LineCap.Round;
p.LineJoin = System.Drawing.Drawing2D.LineJoin.Bevel;
2)重写ISymbol的Draw方法,设置绘图的范围,初始化GDI+的Graphics对象,使用线平滑方式,将设备像素指定为度量单位。
///使用线平滑方式绘制
m_gdi.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
3)开始绘制线符号,首先将实际坐标转换为屏幕坐标,然后循环绘画每个几何对象。
4)判断几何对象的是否包含非线性组合部分,如果没有,通过接口WKSPoint获取几何对象的所有节点,使用Graphics.DrawPath方法绘制;如果包含非线性组合部分,根据线型,绘制相应的线。本插件支持绘制圆弧、贝塞尔曲线、椭圆弧和线段。
5)释放Graphics对象,释放设备句柄。
图2 工具界面
图4 特殊线型
6、线修饰
提供线偏移功能,支持对线型添加多组简单符号修饰,并且可以设置修饰符号的大小、颜色等,精确定义起点距离和间隙。
(1)线偏移:使用System.Drawing.Pen. CompoundArray复合钢笔绘制线的偏移;
(2)线符号修饰:分为2种实现方式,第一种方式为使用GDI+通过设置虚线短划线和空白区的长度方式画圆形和方形修饰符号,即设置线帽、线连接方式、短划线终点线帽为圆形或者方形。这种方式效率高,但是能绘制的符号有限。第二种方式使用ArcGIS接口IMarkerSymbol一个一个点绘制。
图5 线修饰
7、结束语
在实现基于ArcMap软件环境的底层图形绘制功能基础上,研究基于ArcGIS的线型符号配置技术,从底层改变其符号定义功能。通过计算机图形绘制技术以及ArcMap技术体系对地理信息数据的图形展现原理,重写线型符号的定义规则,基于ArcGIS的数据源及地图配置,以自定义的图形显示规则独立绘制特殊的线符号。
反走样绘图及精确线型绘制工具实现了实现对线型进行平滑处理,精确定义虚线中的短划线长度及空白区长度,并且可以添加线修饰,达到了在地图符号设计及地图符号配置阶段所见即所得的效果,大大提高了基于地理信息制图效果与制图要求的正确性,大大减少后期处理的工作量。
参考文献:
[1] 程朋根,龚健雅,睦海刚.GIS中地图符号设计系统的设计与实现[J].中国图像图形学报,2000,5(12):1006-1011.
[2] 杨平,任娟.基于GDI+的高质量电子地图实现方法[J].北京测绘,2005,(1):12-14.
[3] 凌云,陈毓芬,王英杰. 基于用户认知特征的地图可视化系统自适应用户界面研究[J]. 测绘学报,2005,(3):277-282
[4] 陈东方,杨华茂. 基于GDI+的分形图形绘制及处理[J]. 电脑编程技巧与维护,2005(08):70-72.
[5] 谢超,陈毓芬. 基于GDI+的电子地图符号库的改进[J]. 测绘工程,2006(02):48-52.
[6] 沈强,张波,陈淑珍,孙晓安.计算机图形学反走样技术与实现.武汉大学学报(自然科学版),2007.2,43(1):113-118
[7] 姜琦. 复杂线状符号库的设计与实现[D].中南大学,2012.
[8] 张慧慧. 基于反走样算法的地图可视化研究[J]. 甘肃科技纵横,2014,43(1):37-39.
作者简介:
陈海尊,助理工程师,大学本科,地理信息系统专业,主要从事地理信息系统、软件开发等方面的工作。
论文作者:陈海尊,廖静妮
论文发表刊物:《防护工程》2018年第35期
论文发表时间:2019/3/29
标签:符号论文; 地图论文; 虚线论文; 长度论文; 白区论文; 平滑论文; 定义论文; 《防护工程》2018年第35期论文;