ArcGIS Engine在地图打印系统开发中的应用研究
1引言
电子地图的打印输出就是将电子地图转化为纸质地图。与纸质地图相比,电子地图最显著的特征是数据的存贮与显示相分离。由此产生电子地图的一系列新特点,如动态性、交互性、多媒体集成性、多尺度性等。但电子地图具有很强的设备依赖性,且不如纸质地图直观[1]。而将电子
地图打印输出为纸质地图,既利用了电子地图制作简单、省时省力的优势,又具有了纸张使用方便的特点,逐渐成为纸质地图生产的一种新方法[2]。
目前,众多地图打印输出软件的开发中,ESRI公司的ArcGIS Engine作为一个GIS组件库,它在实现地图打印输出功能中,能够大大提高开发效率,而且使用可视化软件开发工具开发出来的应用程序具有更好的外观效果。
2 开发环境
ArcGIS Engine是ArcGIS的系列产品之一,是用来构建制定应用的一个完整的嵌入式的GIS组件库。利用ArcGIS Engine,开发者能将ArcGIS功能集成到一些应用软件如Microsoft Word和Excel中,还可以为用户提供针对GIS解决方案的定制应用[3]。
本文实例以Visual Studio.NET为开发平台,采用C#可视化编程语言,建立基于ArcGIS Engine组件的地图打印输出模块,主要实现在生成的电子地图基础上,对其进行图面整饰,最后实现制图输出。
3 AE中用于打印输出功能的组件
ArcGIS Engine组件环境下的用于地图打印输出的组件有页面组件,打印组件和纸张组件。
页面组件对象对应着ArcGIS中的版面视图,控制着应用程序的窗口,是一个图形容器(graphics container),可以存放各种图形要素,如文字要素,框架要素如地图框架等。为了实现硬拷贝输出功能,页面组件对象会自动创建咬合网格,咬合向导、标尺设置以及页对象。IPageLayout接口是页面布局对象所实现的首要接口。使用该接口,可以访问标尺设置、咬合网格、咬合向导以及页对象,同时还提供一些方法来实现视图缩放、改变当前地图等。
打印组件用来实现绘图仪或打印机这样的硬拷贝(hardcopy)设备输出。有三个打印机对象(EmfPrinter、PsPrinter和ArcPressPrinter)继承打印机抽象类。每个对象都支持向硬拷贝设备的打印。但是各自有着不同的方法来达到这一目的。
选择哪一个对象来发送输出,取决于用户希望使用的打印种类以及可获取的打印设备。所有的打印机对象都实现了IPrinter接口,纸张Paper属性是根据应用程序所在系统的默认打印机初始化的,用户可以创建自己的纸张对象来使用不同的打印机。PrintToFile属性使得发送输出文件成为可能。DoseDriveSupportPrinter方法允许开发者测得选定的打印机是否受到当前驱动的支持。使用StartPrinting方法,将返回一个hDC(指向打印机设备上下文的句柄),这可以被用在IActiveView. Outout方法中以向打印机发送输出。然后,可以利用IPrinter.FinishPrinting方法直接把所有信息写入打印机或绘图仪内存。
纸张组件是地图输出中的一个关键组件。该组件负责维护有关纸张及打印的属性。应用程序启动时,会根据系统默认的打印机来初始化纸张对象。要是用另外的打印机,开发者必须定义一个新的纸张对象,并且通过PrinterName 属性来设置到打印机或绘图仪。这样纸张对象就可以通过IPrinter.Paper属性来关联到打印机对象。
4 系统的总体设计及功能实现
4.1总体设计
与纸质地图相比,电子地图打印输出的总体设计要更为复杂。在纸质地图的总体设计中,需要确定内容的结构编排、地图的分幅方案、地图的尺寸,设计数学基础、版面、制印工艺等基本内容[4]。而在电子地图的打印设计中,上述内容不仅都有涉及并且还有许多不同,同时还包括可视化交换工具的设计。总体设计的内容为图1所示。
(1)确定地图的输出内容
电子地图具有动态、多尺度、无边界等特点,地图的内容随用户的操作而变化。因此,打印地图的内容就应由用户来确定。从打印范围上讲,可以由用户指定任意的范围打印。但从图面的完整性来讲,不具有地图知识的用户很可能将打印地图的范围设置得不合理。这样就需要为用户提供两种选择:完全按照用户设置的范围打印或自适应完整的打印范围。从内容上讲,电子地图由于屏幕尺寸及分辨率的影响,无法像纸质地图一样显示得非常精细。因此也需提供两种选择:按照所见即所得的方式打印或适应打印比例尺的内容要求。
(2)确定地图的数学基础
在纸质地图的生产中,设计者根据地图用途和制图区域范围确定一种投影方式及比例尺。而在电子地图的打印中,用户可以在设计阶段自由选择投影方式和比例尺。因此,必须提供各种投影的正解、反解变换,以及各投影之间的变换[5]。从智能化的角度讲,应该能够根据打印范围的大小,提供若干种适合该制图区域大小的备选投影。由于打印的范围可以由用户指定,可能会遇到很多问题,如坐标的标注,经纬网线及方里网线的绘制等,都需要具有一定的智能化和交互性。
(3)地图整饰
地图整饰在很大程度上影响了打印地图的效果。地图整饰可以分为解释性整饰和装饰性整饰两种类型。其中解释性整饰的作用是向读者提供某些必要的信息,提高地图的可读性,如图名、比例尺、图例和文字说明等,这类整饰的设计要以便于读者阅读为基本依据,兼顾美观性;装饰性整饰如图框主要起到装饰的作用,因此要注意其艺术性以及与地图主题的匹配[6]。
(4)交互工具设计
交互工具是体现制图者地图认知结果和经验、与用户进行交流的窗口。工具的设计应在制图规则允许的前提下具有最大程度的灵活性、易用性,界面应友好。在功能方面,应具有选择打印区域、比例尺、投影方式、输出纸张等基本功能,还应具有交互式编辑图名、比例尺、图例等图外整饰的式样与内容的功能。
4.2系统主要功能
在.NET框架下,将ArcGIS Engine中的页面控件(AxPagaLayoutControl)添加至引用中,并在代码写入using ESRI.ArcGIS .PageLayoutControl ,即可调用页面控件。以此为基础实现以下功能。
(1) 地图显示基本操作
地图的基本操作包括图形的显示、放大、缩小、全图显示,以及图形平滑漫游。本系统通过页面控件中LoadMxFile方法实现地图显示,调用ControlCommands中的ControlsMapZoomInToolClass()、ControlsMapZoomOutToolClass()、ControlsMapPanToolClass()
来实现地图放大、缩小、漫游等操作。
(2) 编辑地图整饰要素
在程序中,创建了类(CMapSurround)用于生成图饰要素,其中定义了AddTextToLayout()方法用于向页面中添加文本标题,CreateLegend()方法用于生成图例,CreateScaleBar()方法用于生成比例尺条,CreateScaleText()方法用于生成比例尺文本。以AddTextToLayout()为例,程序代码如下:
public void AddTextToLayout(IActieView pActiveView,IGraphicsContainer
pGraphicsContainer,int x,int y)
{
ITextElement pTextElement;
IElement pElement;
pTextElement=new TextElementClass();
pElement=pTextElement as IElement ;
pTextElement.Text = "…";//此处为要添加的文本
pElement.Geometry=pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x,y);
pGraphicsContainer.AddElement( pTextElement as IElement , 0);
pActiveView.PartialRefresh( esriViewDrawPhase.esriViewGraphics, null, null ) ;
}
在主程序中初始化此类,就可调用这些内部的方法来为页面添加图饰。系统中地图整饰的菜单截屏如图2所示。
在添加图饰过程中,还要注意图面的配置要有一定的灵活性,如图名的位置、图名字体的大小等;但还要遵循一定的原则,如图名字的大小不得超过图边长度的一半、说明性文字尽量放置在图的下方等[7]。
(3) 实现地图打印
完成图饰的添加后,最后打印页面视图。调用GetPrinter()获取打印机设备,利用IPageLayout接口对打印纸张进行设置,包括用纸的大小和横竖方向。调用PrintPageLayout函数实现打印。
5结语
电子地图的打印输出是一个完整的地理信息系统所不可缺少的功能模块,采用ArcGIS Engine组件在开发此模块中具有简单、快捷、高效、方便等诸多优点。它和面向对象的高级计算机编程语言结合的方式使得它既能充分发挥管理空间地图数据的优势,又能使开发者快速生成友好的用户界面,便于实际应用。本系统就是在ArcGIS Engine组件的基础上实现了宗地图的自动输出功能。虽然系统在某些方面还不是十分成熟,但实践表明利用ArcGIS Engine组件的基本功能可以实现较复杂的地图打印。
O2O迎来杀手级入口室内地图开发应用及展望
北京新版停车地图打印出炉全市再增近7万个停车位
返回列表