摘 要: 文章提出了基于MapInfo的常用的电力设备图形符号库的设计方案,并论述了其主要功能的实现方法。设计方案采用用户自定义图形符号的方法,提高了软件的适应性。利用图形符号的绘图功能扩展了MapInfo的功能,大大提高了图形的编辑效率。
关键词: GIS, CAD,MapInfo
1 问题的提出
CAD系统提供交互式的图形处理功能,其主要特点是设计者与计算机模型的交互,而GIS强调对空间数据的分析[1]。CAD提供了较GIS更方便的图形录入和编辑功能。MapInfo Professional是功能强大、全面而直观的桌面地理信息系统之一,它的图形编辑功能同样不如AutoCAD方便快捷。地理数据如何有效地输入到GIS中是一项琐碎、费时、代价昂贵的任务,通常被认为是长期困扰GIS发展的“瓶颈”[2]。笔者根据多年的电力GIS开发经验,基于MapInfo开发了电力设备图形符号库管理模块。此模块参照CAD的图形编辑功能,扩展了MapInfo的图形编辑功能,并提供了常用电力设备图形符号的录入和编辑功能,大大提高了电力GIS图形的录入和编辑效率。
2 模块的总体结构和主要实现方案
此通用模块管理的对象主要包括输电设备、变电设备和配电设备,如:杆塔、导线、电缆、开关、变压器、刀闸等。模块的总体结构如图2-1所表示,包括图形管理和图形绘制编辑两个部分。图形管理部分主要完成常用设备图形的类型和名称管理,并录入和维护设备图形;图形绘制编辑部分主要处理利用设备图形绘制电力GIS图形的相关功能和设置,如:图形的旋转、放大、缩小、对齐、复制和调节等功能。
MapInfo的OLE Automation技术使得开发人员能够将MapInfo集成到其他常见编程语言,如:Visual Basic、PowerBuilder(简称PB)、C 以及Delphi等。MapBasic是在MapInfo平台上开发用户定制的应用程序的编程语言。一些较复杂的应用可通过MapBasic进行二次开发[3],扩展MapInfo功能,并使MapInfo与其他应用软件集成。因此模块的开发采用将MapInfo通过OLE Automation技术集成到PB中集成开发的方式;其中的所有管理界面采用PB实现,并在PB中调用MapInfo的相关功能;设备图形的绘制和编辑功能采用MapBasic语言实现。
3 模块的主要功能设计和实现
3.1 图形管理功能
为了避免此模块受不同数据库的限制,增加其通用性,在图形中增加一张非图形化(Mappable)的表dev_graph来保存设备图形的类型和名称等信息。每个设备图形都设计成一个图层,系统根据图层的名称与设备名称关联。dev_graph的表结构如图3-1所表示。
图形类型管理功能包括设备类型的添加、删除和修改。为了防止设备完全删除后,类型数据的丢失,将设备类型和设备数据根据字段dev_no分开,负数为设备类型数据,正数为设备数据。字段dev_no的数据由程序自动生成,操作员不得修改。
图形名称管理功能包括设备的添加、删除和修改。其中图层名称(dev_layer)和设备编号(dev_no)字段为自动生成字段,由程序控制。
图形录入功能包括设备图形的绘制、编辑和保存功能。绘图功能包括在MapInfo软件界面中出现的所有绘图功能,如画点、线和多边形等绘图和图形设置功能。在PB中采用下列语句实现画折线功能:
Mioo.RunMenuCommand(1713 ) // Mioo是与MapInfo建立连接的oleobject变量;1713为从MENU.DEF文件中得到的画折线的MenuId。
3.2 图形绘制编辑功能
1、操作参数设置:主要设置图形旋转的角度、移动的步长、图形放大和缩小的倍数等图形编辑功能的参数。这些参数在程序中以全局变量存在,并以文本文件方式与图形一起存入图形服务器硬盘。
2、图形旋转功能:在绘图窗口中首先选中需要旋转的图形,然后根据设置的旋转角度旋转图形。可以旋转的图形类型,包括直线(Line)、折线(PLine)、区域(Region)和文本(Text)。由于篇幅限制。下面仅给出折线旋转的主要程序代码:
PolygonNum = ObjectInfo(_obj, OBJ_INFO_NPOLYGONS) //得到折线的分区(section)数
For i = 1 To PolygonNum //处理每一个分区
NodeNum = ObjectInfo(_obj, OBJ_INFO_NPOLYGONS i)//得到某一分区的节点(node)数
For j = 1 To NodeNum ////处理每一个节点
tmpx=ObjectNodeX(_obj, i, j) – CenterX // CenterX为折线中心的X坐标
tmpy=ObjectNodeY(_obj, i, j) – CenterY // CenterY为折线中心的Y坐标
//计算当前节点旋转后的坐标,RotateAngle为设置的旋转角度,DEG_2_RAD为弧度变换常数
x=CenterX tmpX * cos(RotateAngle*DEG_2_RAD) - tmpY * sin(RotateAngle*DEG_2_RAD)
Y=CenterY tmpY * cos(RotateAngle*DEG_2_RAD) tmpX * Sin(RotateAngle*DEG_2_RAD)
ALTER OBJECT _obj NODE Set Position i,j (x,y) //更新折线对象_obj
Next
Next
3、图形的放大和缩小功能:图形的放大和缩小是指图形实际尺寸的改变,而不是视点的远近移动引起的图形显示尺寸改变。可以放大和缩小的图形对象包括直线(Line)、折线(PLine)、区域(Region)、矩形(Rectangle)、圆角矩形(Round Rectangle)、椭圆(Ellipse)和圆弧(Arc)。放大和缩小的原理是:首先得到某个节点距离图形中心的距离,然后根据设定的放缩参数,计算得到放缩后节点移动的距离,并得到新的坐标。
4、图形移动功能:指在绘图窗口中,根据设置的移动距离上、下、左或右移动当前选中的图形对象。其实现方法同图形旋转功能相同,算法更简单。
5、设置参照功能:设置对齐和调节功能所用的参照图形对象。在图形对齐和调节之前,必须设置参照对象。参照对象在重新设置后,旧的自动删除,即只有一个当前参照对象。其实现方法是获得当前点选的图形对象,并以全局变量保存。
6、图形的对齐功能:主要包括上、下、左和右对齐功能。对齐功能指当前选中的对象(可以是多个),参照当前参照对象,沿上、下、左或右边的边界对齐,即对齐后当前选中的对象与参照对象的节点中的最大Y坐标、最小Y坐标、最小X坐标或最大X坐标相同。其实现方法是获得当前点选的图形对象和参照对象节点的最大Y坐标、最小Y坐标、最小X坐标或最大X坐标,并计算移动的距离,再根据移动的距离得到当前图形对象每个节点的坐标,并更新当前图形对象。这一功能主要用于绘制变电站一次接线图。
7、图形复制功能:指选中已经存在的设备图形,如?n杆,在配电GIS图形中,多次点击可得到多个?n杆图形符号。此功能同样适合MapInfo中的所有标准图形对象。它的实现方法是:首先得到设备图形符号的中心点,根据鼠标点击的当前图层的位置坐标,计算出设备图形符号中所有节点在当前图层中的坐标,并进行复制和移动操作。如果设备图形符号包括多个图形对象,则依次对每个对象进行上述操作。
8、图形调节功能:此功能搜索当前图形对象与参照对象最近的节点A和B,计算其距离,并移动当前图形对象,使得A和B重合。它只适用直线和折线对象,目的是使它们首尾相接,完全消除绘图误差。这一功能主要适用于需要进行拓扑分析的电力线路绘制,如:潮流分析、故障点定位和停电影响范围分析等。它的实现方法是:利用Distance(x1,y1,x2,y2,unit_name)函数搜索图形对象的最近节点,然后计算出纵横方向移动距离,移动当前对象。
4 结束语
文章提出了电力设备图形符号库管理系统的设计方案,并论述了主要功能的实现原理和方法。此设计方案采用用户自定义设备图形符号的方法,大大提高了软件的适应性。它不仅适合电力设备图形符号的管理,对于邮电、交通和公安等其它领域常用绘图符号的管理同样适用。其中利用已有图形符号绘图的功能,还适合MapInfo的标准图形对象,扩展了MapInfo的图形编辑功能,大大提高图形编辑的效率。