曹一冰,江 南,张 毅,刘小林
(信息工程大学测绘学院,河南郑州450052)
基于ArcGIS Engine的地图模板化输出
曹一冰,江 南,张 毅,刘小林
(信息工程大学测绘学院,河南郑州450052)
地图的模板化输出就是利用模板技术思想将制图专家的地图设计知识和实践经验模板化、可视化,对于实现地图设计知识和实践经验的传输与共享,提高地图制图的效率具有重要的理论研究意义和实际应用价值。介绍ArcGIS制图中3种不同的模板技术,分析在.NET平台下采用C#语言基于ArcGIS Engine组件实现地图模板化输出的原理方法以及关键技术,实现页面模板的转换、图面辅助元素的个性化定制及地图的打印输出。
模板;基础模板;地图模板;页面模板;ArcGIS Engine;图面辅助元素
地图的图面设计,一般来说属于地图内容要素以外的设计工作,但它又与地图内容的基本要素有着密切的联系,两者互为补充,不能分割。图面设计不仅在于美化地图,提高地图的艺术水平,更重要的还在于通过图面设计,可进一步体现地图的设计风格,便于地图的阅读和使用[1]。
世界上的事物具有相似性,“模板”就是基于这个原理而产生的。其基本思想是从一组相似的事物中抽象出一种框架型的模式,任何一个类似的事物都可以作为以模板为超类派生类型的实例[2]。模板是面向用户的工具,其实质就是一种规范,是定义某一类事物的标准。这一类事物依据相应标准产生、变化并具有一定的约束性[3]。
ArcGIS是美国环境系统研究所(Environment System Research Institute,Esri)在全面整合了GIS与数据库、软件工程、人工智能、网络技术及其他多方面的计算机主流技术之后,成功推出的代表GIS最高技术水平的全系列GIS产品。ArcGIS是一个全面的、可伸缩的GIS平台,可为用户构建一个完善的GIS系统,提供完整的解决方案[4]。为了提高制图效率,实现ArcMap界面的个性化定制、地图或图层的重复利用、页面视图的标准化,ArcGIS提供了3种不同的模板技术。
1)基础模板(normal template)。ArcMap使用基础模板存储默认的用户界面信息,例如所有Arc-Map工具条的可见性、停靠位置、漂浮状态。这些信息自动记录在基础模板中,不管有无保存打开的地图,当启动ArcMap软件时,工具条的位置保持上次退出系统前的状态。
2)地图模板(map templates)。地图模板不是需要特殊开发工具的应用程序或扩展软件,它是制图专家制作出来的具有专业水准的地图用例,包括地图文件、用例数据、文档和其他资源。它提供了制作地图的框架,实现了地图图层、符号文件等的复用,不论是初级用户还是专业用户都可以利用地图模板学习制图知识和经验,方便高效地制作出具有专家水平的地图作品。
3)页面模板(template map documents)。页面模板是一种后缀以mxt结尾的模板文件,它实现了地图图面设计的标准化,简化了地图内容要素以外的设计工作。当更换页面模板时只有模板中包含的图外要素应用到当前地图中,原始地图的图外要素将被删除(如原始地图中包含图例信息,而使用的页面模板不包含时,最后的地图将不包含图例),模板中的图层数据不会添加到当前地图中。然而,当使用页面模板创建一幅新地图时,模板中的图层数据将被添加到地图中。
本文在分析ArcGIS所采用的3种不同的模板技术的基础上,针对地图图面设计的主要内容研究了基于ArcGIS Engine的页面模板的应用及转换、图面辅助元素的个性化定制、地图的打印输出。实现了页面视图的快速定制、个性化转换及打印输出,提高了地图输出的效率,具有很强的实用价值。
在开发平台的选择上主要从系统的需求以及系统的稳定性、易维护性和可扩展性的角度来考虑,运用微软.NET框架结合ArcGIS Engine 9.3实现系统的主要功能。
ArcGIS Engine是Esri在ArcGIS 9版本才开始推出的新产品,它是一套完备的嵌入式GIS组件库和工具库,使用ArcGIS Engine开发的GIS应用程序可以脱离ArcGIS Desktop而运行。ArcGIS Engine面向的用户并不是最终使用者,而是GIS项目程序开发员。ArcGIS Engine不再是一个终端应用,不再包括ArcGIS桌面的用户界面,它只是一个用于开发新应用程序的二次开发功能组件包[5]。ArcGIS Engine是由平台独立的C++对象构建的,这些对象在Windows和UNIX平台下均可运行,并具有多个开发应用程序接口(API),包括COM、.NET、Java和C++等。开发人员可以利用这些应用程序接口和一些封装好的功能构建应用程序[6]。
C#是可用于创建运行在 .NET CLR上的应用程序的语言之一,它从C和C++语言演化而来,是微软公司专门为用户使用.NET平台而创建的。C#基于IT工业标准,采用了可视化编程技术,开发简单、功能强大、类型安全,而且是完全面向对象的语言。利用C#的特性可以实现应用程序的快速开发,减少开发周期。
页面模板的准备过程就是进行地图图面设计的过程,主要包括两个方面的内容:① 地图的主区构图,地图主区的轮廓图形怎样在图面上摆放,才算是与幅面协调、符合美学观点;②图廓内外诸辅助要素,如图名、图廓、图例、附图、比例尺及各种说明的位置、范围大小及其形式的设计,以及在图面上如何配置,才能达到明显、美观和便于阅读的目的。
ArcGIS安装完成后,在系统安装目录(in Templates)下面,ArcGIS已经提供了很多页面模板,可以使用现有的页面模板或对现有页面模板进行更改调整或者用户创建自己的模板实现页面模板的转换和地图的模板化输出,减少了很多常规的设置。本系统用户可以选择模板文件夹,因此用户自定义的模板文件可以放在系统模板文件夹下,也可以放在自定义的文件夹下,然后用户可以选择并预览该文件夹下的模板文件,选择合适的模板进行应用。
实现地图的模板化输出重点在于研究模板的元素构成及模板的转换、图面辅助元素的定制、地图打印输出。为实现这些研究内容,需要作一些技术设计,并深入分析其在实现过程中遇到的问题和解决它们的关键技术方法。
1.页面模板的应用及转换
页面模板是对地图图面设计专家知识的总结与抽象,这种总结与抽象以模板的形式保存在模板文件中。应用和转换地图模板时,本文的具体思路是:当用户预览模板文件夹中的模板文件并根据具体的制图需求应用相应的模板文件的,将会调用模板转换函数btnChangeTemplate_Click(object sender,EventArgs e)。该函数首先把页面的单位替换为模板文件中地图框的单位,页面的尺寸设置为模板文件中的页面尺寸;其次清空当前视图的Layout并保存MapFrame;最后遍历模板中PageLayout的所有元素,替换当前PageLayout中的所有元素,设置地图的显示方向,刷新整个视图进行显示。部分代码如下
应用模板后地图效果如图1所示。
2.图面辅助元素的个性化定制
图面辅助元素的定制主要是指对图名、图例、比例尺、指北针及各种说明的位置、范围大小及其样式的设计,以及在图面上如何配置。这里主要是对鼠标响应事件的设计处理,通过双击鼠标响应OnDoubleClick事件调用响应函数,根据鼠标双击处图面辅助元素的类型调用相应的功能模块,弹出定制向导对话框对辅助元素的样式等信息进行定制,然后应用符号样式。系统主要实现了图名、图例、比例尺、指北针的定制,说明信息和图名可以归为一类,即均为文本信息,各元素的位置可以通过鼠标选中相应的元素并拖动实现;范围大小可以通过鼠标选中相应的元素并拖动其外围矩形锚点实现;样式的设计可以通过下面方法实现。
图1 更换页面模板
1)图名及各种说明信息。判断类型为ItextElement,主要用到的接口有:ItextElement,实现对文本元素的符号样式和内容的设置;ItextSymbol,实现对文本元素的字体、颜色、角度、大小、对齐方式等的设置。
2)图例。判断类型为Ilegend,主要用到的接口有:Ilegend,地图中的每个图层即为图例中的一项,接口提供了控制图例项的属性(Item,ItemCount)和方法(AddItem,RemoveItem);IstyleGalleryItem,符号样式容器,每个符号都有一个唯一的ID,通过ID来获取符号。
3)比例尺。判断类型为IscaleBar,主要用到的接口为IscaleBar,提供了控制比例尺的颜色、单位和标注等的属性和方法。
4)指北针。判断类型为ImarkerNorthArrow,主要用到的接口为IMapSurroundFrame,通过该接口控制比例尺的样式。
下面以指北针为例,双击指北针对指北针样式进行更改,效果如图2所示。
3.地图的打印输出
地图通过打印设备输出到纸张是一种常见的地图表现形式,也是数字制图的目的之一。地图的图面设计完成后,就要对地图的内容打印输出,打印输出首先要设置打印机及其纸张尺寸,然后进行打印预览。通过打印预览就可以发现是否可以完全按照图面设计过程中所设置的那样打印输出地图,如果可以就直接打印,否则再重复上述过程。
图2 指北针样式
1)页面设置。首先创建一个用于打印预览的打印文档PrintDocument,把页面设置对话框中的打印机信息设置到PrintDocument的PrinterSettings属性,把页面设置对话框中的纸张大小、页面方向等信息设置到PrintDocument的DefaultPageSettings属性;其次创建EmfPrinterClass对象、PaperClass对象,初始化PaperClass对象的驱动环境等信息,把PaperClass对象赋予EmfPrinterClass的Paper属性;最后把EmfPrinterClass对象与页面控件进行关联。
2)打印预览。把打印文档PrintDocument赋予打印预览对话框的Document属性,然后显示打印预览对话框。
3)打印。把打印文档PrintDocument赋予打印对话框的Document属性,然后显示打印对话框,对当前区域地图进行打印。
目前,众多地图打印输出软件的开发中,Esri公司的ArcGIS Engine作为一个GIS组件库,它在实现地图打印输出功能中,提供了许多用于地图打印的接口,用户能够很方便地利用这些接口中的属性和方法进行打印输出的开发,从而大大提高开发效率。
页面模板的应用不仅使地图的设计制作有章可循,便于用户对地图解读,而且不必花费过多的时间去理解和掌握地图设计中那些“不可言传”的理论和知识,节约大量的地图设计时间,符合地图学“以人为本”的科学精神。更重要的是它规范了图面辅助元素的内容与布局,统一了广大用户对地图整饰的方式,简化了地图设计的工作量,提高了工作效率,节约了成本。同时本系统采用 ArcGIS Engine组件式二次开发,它既可以充分利用GIS工具软件对页面模板的制作、编辑功能,又可以利用C#可视化开发语言具有的高效、方便等编程优点,集二者之所长,不仅能大大提高应用系统的开发效率,而且使用可视化软件开发工具开发的应用程序具有更好的外观效果和更强大的功能。另外,由于ArcGIS Engine采用的是嵌入式组件库,开发的应用模块能够方便地集成到其他开发系统中。页面模板的使用特别是对于打印大批量具有相同地图整饰内容的地图具有重要的意义。
[1] 陈毓芬,江南.地图设计原理[M].北京:解放军出版社,2001.
[2] 刘晓平,韩江洪,张佑生,等.工程CAD中的模板运算与性质研究[J].系统仿真学报,2000,12(6): 592-599.
[3] 冯晓宁.基于模板的工程对象设计[J].工程图学学报,2000,21(1):60-65.
[4] 吴秀芹,张洪岩,李瑞改,等.ArcGIS 9地理信息系统应用与实践[M].北京:清华大学出版社,2007.
[5] 蒋波涛.插件式GIS应用框架的设计与实现:基于C#和ArcGIS Engine9.2[M].北京:电子工业出版社,2008.
[6] 罗雄.ArcGIS Engine开发入门介绍[J].ArcGIS中国通讯,2010,29:96-100.
Template-based Map Output Based on ArcGIS Engine
CAO Yibing,JIANG Nan,ZHANG Yi,LIU Xiaolin
0494-0911(2011)07-0060-04
P208
B
2010-08-04
测绘学院硕士学位论文创新与创优基金
曹一冰(1986—),男,河南商丘人,硕士生,主要从事GIS的研究与开发。