基于MapObjects和DLL的自定义地图面符号库的实现*
2012-04-27陈国良
刘 金,李 钢,陈国良
(1.中国矿业大学 环境与测绘学院,江苏 徐州221116;2.徐州市国土资源局,江苏 徐州221116)
0 引 言
一般来说,地图符号的设计和实现方法分为两种:一是在已有软件的基础上利用其二次开发语言及自身的图形编辑功能进行自定义符号,如ArcInfo,AutoCAD,MapInfo,ArcView以及Corel-Draw等[1-3];二是利用程序语言自己开发符号设计软件平台实现符号,目前,最流行的就是OOP和COM技术等[4-10]。地图符号库主要是针对计算机而不是专门针对地理信息可视化,而我国的各种比例尺地图中的地理信息内容十分丰富,要素表述非常详尽,现无法扩展复杂和特殊的符号。
为了克服组件MapObjects自带缺省符号的缺乏无法满足工程的需要,主要研究一种在地理信息工程中可以根据地图符号规范来制作地图面符号库,具有良好的扩充作用,满足相应工程需要,应用于实际工程,同时对制作点线符号库也有很大的参考价值。
1 面符号库的设计
面状符号是指地图上用来表示呈面状分布的物体或地理现象的符号,它在二维图的各方向上都能按比例表示,如按比例表示的耕地、果园、水域等符号。
1.1 面状符号的特点
面状符号除了拥有地图符号的一般特点外,面状符号还有如下特点:
1)面状符号一般有一个封闭轮廓边界线,这个边界线可以是有形的也可以是无形的。
2)面状符号的面积和范围都是依比例表示的,其大小随地图比例尺变化而变化。
3)为区别边界线范围内的对象,不同的面状符号在边界线范围内填充不同的点符号、线符号、位图或颜色来区分。
1.2 面符号的制作
面状符号实际上是一种组合符号,一般都是由填充组合而成。一般面状符号的填充方式有三种:点状符号填充、晕线填充、简单填充。
三种填充方式各有特点,通过查阅大量文献比较和比较各种符号制作软件,设计出一种比较好的制作方式。在CorelDRAW中设置版面,按照地形图图式规范进行绘制,可以准确设置符号大小和位移间隔。需要注意的是页面设置大小能符合循环,图1示出了用CorelDRAW绘制菜地的实例。为了在应用工程调用比较好的效果,再输出bmp格式根据需要调整大小。
图1 菜地制作与规范
位图绘制比较方便,绘制位图地图符号基本可以满足点状地物及复杂点状地物。在GIS中,利用位图表示面状地物有以下几个优点[11]:
1)对客观世界中的目标地物抽象时丢失的许多直观信息可以通过该地物的实际图片或象形图片展示,能直接了解地物信息。
2)对空间信息的可视化有重要的帮助,由于位图的设计可以很方便地融合艺术的手段,这些在矢量图形编程中有时并不容易做到。通过位图提供的丰富的符号,可以通过这种方式应用到系统中,增强信息的表达能力和视觉美观。
3)利用位图符号可以直接作为专题图的图例用,可以直接创建诸如点要素分布的专题地图。
2 MapObject中的地图符号
MapObjects是由美国环境系统研究所(ESRI)开发的一组供应用开发人员使用的制图与GIS功能组件。它由一个ActiveX控件和一系列可编程OLE(对象链接与嵌入)对象组成[12]。
MapObjects的CMoSymbol对象为用户提供了有限的缺省的符号样(SymbolStyle)。MO默认缺省面状符号11种,符号类型和值分别通过Style,SymbolType属性设置。这种方式符号数目少,样式单一,不具有专业领域应用前景,不能满足实际应用系统对符号表现多样化的要求。
MapObjects虽然本身不带有丰富的符号库,但它能提供自定义符号的接口函数,使得符号的设计和扩展成为可能[13]。提供的接口自定义符号,可以建立一套自己需要的符号库系统。使用ICustomMarker用来实现点状符号的接口。对于MapObjects中实现自定义符号绘制的自动化对象,至少要实现3个基本函数[14],分别为
1)SetupDC:该函数用来建立绘制符号的设备上下文(Device Context)和设置一些绘制所需要的参数,如符号大小、旋转角度等。
2)ReleaseDC:该函数清除当前设备上下文并恢复原始的设备上下文,用来为下一次绘制提供一个初始设备上下文。
3)Draw:这个函数是自定义符号中最重要的一个函数,它实现了自定义符号的绘制。
通过利用Windows GDI函数,能灵活地绘制各种符号,包括图元、几何图形以及三维实体,通过这些符号能非常形象逼真地显示客观世界中的对象。
3 MapObjects中实现自定义面符号
用CorelDRAW软件制作好的相应比例尺地图面符号,可以实现在工程中的调用,主要流程如图2所示。
图2 自定义面符号实现流程
3.1 ATL开发自定义面符号DLL
ATL是ActiveX Template Library的缩写,它是一套C++模板库。MapObjects已经提供的自定义接口,利用ATL很容易生成DLL,所以使用ATL是一种简单快捷的方法。
创建自定义面状符号,选择接口ICustomFill,以保证能够执行面符接口。三个基本函数Setup-DC、ResetDC和Draw,注意面中的points是封闭的点串:
开发地理信息工程人员,可能对于Windows GDI绘制符号不精通,可以用位图显示来显示复杂地图符号,很好地解决符号编程的困难。为每一个符号创建一个自动化对象是不切实际的,需将面符号对象建成一个对象库,并且具有很好的扩展性。
主要用到加载位图和多边形填充方法来实现面状符号的调用和填充。关键实现代码如下:
编译生成dll。已经生成了一个自定义面状状符号,它放在一个名CustomFillSymbol.dll的动态库文件中,并且可以在MapObjects环境中调用它。
对于将同类面符建成同一符号库,可以通过ATL简单实现,方法与前面相同,可以继续添加如Fill2,Fill3等,使用DLL,可以方便在后台维护,也方便对符号库的管理。这样就建立一个符号对应表如表1所示,供用户需要来选择。
表1 DLL中符号对应表
3.2 VC工程实现符号库调用
在VC++6.0环境中编写一个小的应用工程来实现如何调用刚才生成的自定义面符号。
在应用工程中包含下面的语句,主要作用是调用DLL:
利用ICustomFillPtr来定义指针了,为了方便用户的使用,利用对话框来实现交互。具体关键实现代码:
在应用工程下实现面状符号DLL的调用(以菜地为例),如图3所示。
图3 菜地符号调用效果
一般MapObjects默认是整个图层,但是在实际工程中往往需要对不用图层实现不同的属性,所以CMoValueMapRenderer对象的唯一属性值符号化地图。假设当前有一个土地使用图层,它是由不同使用方式的土地组成:一些住宅区,一些是公园,一些是工业区,还有一些是耕地等。现在要做的工作是,从记录字段中提取属性按土地使用图层进行分类分级显示,原理与上述一样,就是用属性字段的每一个值显示一种符号,以Symbol(i)设置具体的符号特性。对MapObjects自带的“STATES”面图层中的“AREA”属性进行分级,其中部分属性用自定义的面符号来显示。具体实现效果如图4所示。
图4 面符号符号化效果
4 结 论
主要给出了通过CorelDraw软件绘制地图面符号,制作出高精度又可以根据不同比例尺的地图符号,同时很好利用MapObjects提供的面符号接口,实现对符号库的制作和扩充。
地图符号在GIS中占有非常重要的地位,地图符号随着GIS的发展而改进,目前在GIS中对地图符号的研究还属于初级阶段,有许多地方还不够完善,未来还有很多的工作需要去进一步的研究和解决:
1)尚未涉及到点线符号制作和调用,尚未解决线状符号的快速实现,在用到纯函数绘制时,由于知识受限,无法绘制复杂线状符号,通过在CorelDRAW软件绘制好符号,在系统中加载位图或者与ARCGIS中的制作线符号实现,在后期学习中应进一步研究实现。
2)地图符号库包括地图符号编辑器,利用制作软件来绘制地图符号,但不是专门制作GIS地图符号的软件,开发一个脱平台的地图符号编辑器也是后期研究的重点。最好能够设计接口在不同平台实现调用。
3)主要研究的是二维的地图符号,而地图符号已经开始向多方向发展:从静态符号到动态符号发展;从二维符号向三维符号发展以及多媒体地图符号的发展。
[1] 姚兴海,马秋云.基于CorelDraw的地图符号库建库[J].测绘通报,2003(2):36-38.
[2] 罗庆洲,张卫民,李先华.在常用GIS软件中实现自定义地图符号[J].测绘通报,2003(1):44-45.
[3] 程朋根.GeoStar地图符号的实现方法[J].地矿测绘,1999(3):3-6.
[4] 谈晓军,边馥苓,何忠焕.地图符号可视化系统的面向对象设计与实现[J].测绘通报,2003(1):11-13.
[5] 杨春成,宋志刚,吴文会.基于OOP技术的地图符号制作工具的设计与实现[J].测绘科学,2002,27(1):50-53.
[6] 蔡忠亮,李 霖.普通地图符号的全开放式设计[J].武汉测绘科技大学学报,1999,24(3):259-261.
[7] 吴立新,刘纯波,陈桂茹,等.地图符号库的面向对象技术和引用接口[J].矿山测量,1999(1):32-35.
[8] 程朋根,龚健雅,眭海刚.GIS中地图符号设计系统的设计与实现[J].中国图形图象学报,2002,5(A)(12):1006-1011.
[9] FRANK A U,ENGENHOFER M J.Computer cartography for GIS,an object-oriented view on display transformation[J].Computer and Geo-sciences,1992,18(8):975-987.
[10] 王 伟,张 波,殷赣华.基于COM技术的地图符号库结构设计与实现[J].武汉大学学报·信息科学版,2002,27(3):296-300.
[11] 刘黎明.基于MapObjects的位图符号的设计与应用[OL][2006-07-31].中 国 科 技 论 文 在 线.http://www.paper.edu.cn.
[12] 胡庆武.基于MapObject的地图符号库设计[J].测绘通报,2001(10):15-17.
[13] 赵冬泉,贾海峰,程声通.基于MapObjects的排水管道流向表达与编辑[J].测绘通报,2004(8):36-37,55.
[14] 戴 维,刘志辉.基于MapObjects的自定义地图符号块的实现[J].水土保持研究,2008(2),15(1):196-197.