基于Coreldraw vba的GIS空间线数据自动光滑综合研究
2017-12-12李正祥
李正祥
摘 要:地图制图出版对地图版面效果有着很高的要求,其符号、曲线、注记的配置与美观程度直接影响读图者的心里感受。Coreldraw软件因其强大的文字、曲线和效果编辑功能,深受地图制图者的喜爱。文章基于vba 二次开发,研究了GIS地理空间线数据在Coreldraw制图中的转化、光滑和自动综合等方法,极大减小了地理空间线数据在Coreldraw制图中的工作量,提高了制图质量、增强了图面效果。
关键词:Coreldraw vba制图;GIS空间线转化;自动光滑;线综合处理
中图分类号:P283.7 文献标志码:A 文章编号:2095-2945(2017)34-0016-02
1 GIS地理空间线数据与Coreldraw制图曲线比较与转化思路
1.1 GIS空间线数据图形特点
GIS地理空间数据库本质特征是基于图形的属性数据存储与查询,其空间线图形是以节点位置为单元的存储方式,按节点顺序以折线方式表达来符合地理空间线、面特征。其节点为直线型节点,节点无调节作用,仅限定直线段通过。空间特征表现越精确,图形节点数量越多,折线段量则越大。最大构成单个图元节点数量可高达十万个,文件大小至千兆字节。
1.2 Coreldraw制图曲线数据特点
Coreldraw制图线数据是一种非属性的图元结构。受地图图面表达美观、简洁的视觉要求限制,图形一般以节点控制的光滑曲线来表达,特别是中小比例尺地图制图,还必须对线、面等部分细微特征进行制图综合,保留优化后的宏观特征。其节点类型可分为尖突节点、平滑节点和对称节点3类, 受制图软件限制,Coreldraw文件大小一般为几百兆字节以内。
1.3 折线数据转化为制图曲线思路
由折线与曲线的特点和控制节点性质可知,折线转化为曲线,同时对节点类型转换,可实现曲线光滑处理。综合拉直按成图比例尺大小,根据地理空间线要素空间分布特点,删除不必要的细微特征控制节点,保留宏观特征节点,就可实行地图制图的曲线要素自动综合。
2 vba程序设计
GIS地理空间线数据在生产过程中,需按实际线状要素特点,使用折线近似平滑描绘真实空间走向,因此在Coreldraw软件中则要将折线转化为最广泛使用的贝赛尔光滑曲线,并对曲线中冗余节点进行删减,控制曲线特征节点手柄方向和曲率来表现真实地物的基本特征。
2.1 曲线转化及节点减少
经过空间处理的GIS线数据导入Coreldraw制图软件时为直线节点控制的折线段,必须进行曲线转化和节点处理,减少数据量(庞大的数据量对计算机性能要求很高,容易造成Coreldraw软件卡死),方便于地图制图。为便于制图者对每个线要素的关注和操作,保守的做法是采用先选取再处理的程式。具体实现主要代码如下:
For Each seg In ActiveShape.Curve.Segments
‘枚举选中的每一条线要素
If seg.Type = cdrLineSegment Then sgr.Add seg‘将每条直线并入组集合
Next seg
sgr.SetType cdrCurveSegment
‘直線组集合转化为曲线
sgr.NodeRange.SetType cdrSmoothNode
‘设置组集合节点为光滑节点
………
‘设置光滑节点系数K,以达到折线数据拟合为贝赛尔曲线,代码如下:
For Each s In ActiveSelectionRange.Shapes
‘枚举所选图形
If s.Type = cdrCurveShape Then
s.Curve.Nodes.All.Smoothen K
‘按光滑系数K进行贝赛尔拟合
End If
Next s
………
‘曲线节点数减少可设置减少系数M调节,主要代码如下:
Dim M As Double
M = TextBox2.Value
If CheckBox3.Value = True Then
ActiveShape.Curve.Nodes.All.AutoReduce M
‘按M系数对曲线上所有节点自动减少
End If
K值的不同,拟合的曲线有不同的效果,M不同,节点优化量不一。
2.2 中小比例尺曲线综合拉直
真实世界中地形地物千差万别,作为表现其特征的地图不可能有统一表示,地图创作的差别各源泉也主要反映在制图综合方面。本程序综合拉直功能算法从两方面进行考虑:一是根据依次递归控制曲线特征的3个节点Nodes(1)、Nodes(2)和Nodes(3),取Nodes(2)距Nodes(1)、Nodes(3)连线间距离与Nodes(1)和Nodes(3)间线段长度比值(与曲率相关)作为控制Nodes(2)特征是否保留的依据。二是顺序判断相邻节点间弧线长度,小于预设值则舍弃节点,可对弯折较多的特征点进行适度的综合拉直处理,如图所示。主要代码如下:
n = sp(1).Nodes.count‘曲线上节点数
For i= 2 To n - 1
‘获得3个节点的坐标
ax = sp(1).Nodes(i - 1).PositionX
ay = sp(1).Nodes(i - 1).PositionY
bx = sp(1).Nodes(i).PositionXendprint
by = sp(1).Nodes(i).PositionY
cx = sp(1).Nodes(i + 1).PositionX
cy = sp(1).Nodes(i + 1).PositionY4
‘获得相间两节点弧线长度
nr = sp(1).Nodes(i - 1).GetDistanceFrom(sp(1).Nodes(i + 1))
‘面积法计算中间点与相间隔节点间直线距离dis
A = Math.Sqr((cx - ax) * (cx - ax) + (cy - ay) * (cy - ay))
B = Math.Sqr((bx - ax) * (bx - ax) + (by - ay) * (by - ay))
C = Math.Sqr((cx - bx) * (cx - bx) + (cy - by) * (cy - by))
p = (A + B + C) / 2D = Math.Sqr(p * (p - A) * (p - B) * (p - C))
dis = 2 * D / A
‘相间节点间距离小于0.2,则舍弃中间I 节点
If nr < 0.2 Then
sp(1).Nodes(i).Delete
‘点与线段间距离dis与线段长度比值小于M则舍弃节点i
Else: If dis / A < M Then sp(1).Nodes(i).Delete
End If
Next i
3 结束语
在实际数据库线数据制图自动光滑综合过程中发现,本二次开发对于折线转曲线并减少节点光滑综合效果和特征点保留很好,可很好地应用于相近比例尺的制图和缩编。然而,对于比例尺跨度较大,如1:10000缩编至1:100000以下时,综合拉直在一些特殊地方,如连续转角过多地方还需进行人工编辑和调整。
参考文献:
[1]王雷,赵冰雪.ArcGIS与CorelDraw数据格式转换实现[J].宿州学院学报,2016(10):107-109.
[2]曾克明.Coreldraw软件的二次开发在地图制图中的应用与实例[J].测绘通报,2010(8):60-61.
[3]焦灵,等.Coreldraw X7平面设计与制作[M].高等教育出版社,2017,3.
[4]劉洋,郭庆胜,等.Coreldraw线状地图符号库的设计[J].测绘工程,2017,26(7):66-70,75.
[5]周园.地图与地图制图[M].武汉大学出版社,2011,11.endprint