基于Style符号库的存取研究及符号选择器实现

2011-11-15 03:30樊文锋叶芳宏
测绘通报 2011年11期
关键词:选择器序列化字段

樊文锋,王 怀,叶芳宏

(国家测绘地理信息局卫星测绘应用中心,北京100830)

基于Style符号库的存取研究及符号选择器实现

樊文锋,王 怀,叶芳宏

(国家测绘地理信息局卫星测绘应用中心,北京100830)

在ArcGIS Engine的应用开发中,无法直接利用Style符号库文件。通过对ArcGIS符号库文件存储结构的剖析,详细分析符号存取的接口方法,并在此基础上开发出针对Style符号库文件的符号选择器组件,且该组件能够在ArcGIS Engine的应用开发系统中直接使用。

符号;序列化;重构

一、引 言

符号是一种物质的对象、属性或过程,可用它来表示抽象的概念。符号是地图的语言单位,是可视化表达地理数据信息内容的基础工具。地图符号是符号应用于地图的一个子类,具有语义、语法和语用规则[1]。地形信息符号库是地图符号的汇集系统,它利用计算机进行管理,以实现符号数据的存储、检索和更新[2]。随着地理信息系统技术和理论的发展及其在各行业的广泛应用,地理信息符号化表现形式已经发生了巨大的变化,其功能也由认知地图空间为主扩展至动态导航、辅助决策。

ArcGIS针对地理数据的点、线、面要素提供了不同类型的符号,用户可以选用任意一种类型符号对地理数据进行符号化显示。而且ArcGIS符号设计完全是在ArcGIS桌面环境ArcMap下实现,以Style库文件存储。但是基于ArcGIS Engine的应用开发中,采用的是ServerStyle符号文件,无法直接使用ArcGIS桌面环境下设计的Style符号文件,只有通过工具MakeServerStyle把Style符号库文件制作成ServerStyle符号库文件才能供其使用。但在实际应用中,很多ArcGIS Engine应用开发都希望能够在系统中直接使用Style符号库文件,而不需要通过第三方工具转换。

笔者通过研究剖析Style符号库文件的存储结构,编程开发了利用Style符号库文件的选择器组件,使得在ArcGIS Engine应用开发中能够直接使用Style符号库文件。本文主要探讨Style符号库文件的存储结构、符号存储接口以及符号选择器的实现。

二、Style符号库文件存储结构

Style符号库文件实际上是小型关系型数据库文件,其文件的扩展名为*.style,可以将扩展名更改为*.mdb后用微软的Access软件打开。

数据库中的每个表结构都相同,每个表都是由ID、Name、Category、Object 4个字段组成。其中,ID字段是整型数据类型,是该表的关键字,保持记录的唯一性;Name字段是字符串类型,用来命名符号的名称,在对地理数据符号化的过程中,可以将地理数据的属性信息与该字段进行自动符号化;Category字段是字符串类型,用来表示符号的分类,可以通过该字段进行分类查询过滤;Object字段是OLE类型,用来存储符号的信息,该字段包含了符号的CLSID值和符号信息数据,是通过符号序列化接口序列化后的二进制数据流。在符号二进制数据流中,前16字节是符号对象的CLSID值,是GUID数据类型,通过CLSID值可以创建符号对象;余下的数据流是符号信息数据,包含了符号的颜色、大小、宽度、旋转角度等信息,可通过序列化和反序列化实现存储和读取。

数据库中的每一张表对应着ArcGIS符号中的一类符号,数据库中存储ArcGIS基本的点、线、面、文本符号以及其他颜色、比例尺、图例等符号[3]。

三、Style符号接口分析

从ArcGIS的应用开发包中可以看出,实现符号的存储、显示以及符号的选择主要由符号序列化结构、基本的符号接口、符号库的访问接口以及符号库文件等接口组成。以下将描述主要的接口及其实现方法。

1.序列化接口

序列化是将对象状态转换为可存储的数据流格式的过程。与序列化相对的是反序列化,它将流转换为对象。将这两个过程结合起来,可以轻松地存储和重构数据。序列化接口主要是实现符号的存储和重构,包括 IPersist、IStream、IPersistStream、IBlobStream、IMemoryBlobStream等主要接口。其中,IPersist、IStream、IPersistStream是微软提供的数据流标准接口。IPersist是获取对象的CLSID值的接口; IStream是对数据流进行读取、写入以及移位等操作的接口;IPersistStream是根据加载和保存数据流的接口。而IBlobStream、IMemoryBlobStream两个接口主要实现符号对象的存取。其中,IMemoryBlobStream继承IBlobStream、IStream接口,并在IMemory-BlobStream接口的实现类中全部实现其接口的方法以及属性,还可实现将符号对象序列化成二进制数据流存储和从二进制数据流中反序列化重构符号对象。

2.基本符号接口

ArcGIS提供了 ISymbol、IMarkerSymbol、ILine-Symbol、IFillSymbol以及ITextSymbol等基本符号对象接口,根据这些接口可再衍生出其他丰富的符号接口,如IPictureMarkerSymbol等。其中,ISymbol是符号对象根据图形设备接口进行绘制,所有的符号必须继承该接口;IMarkerSymbol、ILineSymbol、IFill-Symbol和ITextSymbol分别是点、线、面、文本符号的基本接口,且定义了符号的大小、宽度、颜色、旋转角度、字体等信息。其派生的符号对象接口必须继承基本符号接口,其实现类中必须实现其方法和属性。同时,IMarkerSymbol、ILineSymbol、IFillSymbol和ITextSymbol派生接口的实现类必须实现IPersist、IPersistStream接口的方法和属性,以实现符号对象的存取。

3.符号库访问接口

符号库的访问接口主要由IStyleGallery、IStyle-GalleryStorage和数据库访问ADO接口组成,用于实现符号对象序列化成二进制数据流存储到符号库中,以及从符号库中取出二进制数据流重构符号对象。IStyleGallery接口是应用系统从符号库中提供符号对象和将符号对象保存到符号库中的接口; IStyleGalleryStorage接口是管理多个符号库文件的接口,并能使符号选择器同时能够打开多个符号库文件;ADO接口是对数据库表进行插入、查询、更新操作的接口。

四、Style符号选择器实现

以下将阐述如何对IMemoryBlobStream接口实现在内存中进行数据流操作,如何以点符号对象为例实现符号序列化存储和反序列化重构,如何以C#语言编程实现符号选择器组件。图1是符号对象序列化重构的流程图。

图1 符号序列化重构流程图

1.IMemoryBlobStream接口实现类

IMemoryBlobStream接口的实现类中,继承实现了IStream的方法及属性。其实现过程如下:

1)创建内存存储区域,根据数据的大小动态调整内存空间的大小。

2)实现IStream接口的Write、Read、Seek方法,即分别是写入内存、读取内存、内存地址移动。

3)实现ExportToVariant方法,从内存数据空间导出符号对象序列化得数据流,实现符号对象序列化操作。

4)实现ImportFromMemory方法,加载外部内存空间的符号对象的数据流,供符号对象使用,实现反序列化操作。

2.序列化存储操作

以简单点符号为例实现符号对象的序列化存储,如用简单点符号的成员变量描述符号的大小、颜色、旋转角度属性。下面用部分代码描述序列化过程。

1)简单点符号的成员变量

int m_lColor;

double m_dAngle;

double m_dSize;

2)简单点符号序列化存储函数Save,其中参数pStream实现了IMemoryBlobStream接口的Write方法向内存中写入数据

Void Save(IStream*pStream)

3)简单点符号反序列化重构函数Load,其中,参数 pStream实现了 IMemoryBlobStream接口的Read方法向内存中读取数据

3.IStyleGallery接口实现类

在IStyleGallery接口实现类中,主要的方法是实现对符号库文件的加载、符号分类获取以及符号存储,下面是实现该接口的主要方法和属性。

1)LoadStyle方法,即加载符号库文件,对多个符号库文件进行管理。

2)SaveStyle方法,即保存符号至符号库文件。

3)AddItem方法,即存储符号。

4)Categories属性,即获取符号的分类。

5)Items属性,即获取符号对象。

4.符号选择器

符号选择器为ArcGIS Engine的应用开发提供了一个可视化的符号对象浏览工具,应用开发系统可以通过它预览符号库中的符号。符号选择器可以根据当前要符号化的地理数据属性(点、线、面)从符号库文件中加载全部的符号,也可以加载指定的类别的符号。在ArcGIS桌面环境ArcMap下的符号选择器,能够对选定的符号作适当的编辑修改后对地理数据进行符号化,同时也能对修改后的符号进行保存处理。在本文中实现的符号选择组件暂时不能够提供选定符号对象的编辑修改以及保存操作。

本文描述的符号选择器组件采用C#语言开发,实现了对Style符号库文件的符号选取,并应用在以ArcGIS Engine开发的某省级基础地理信息数据库管理系统中。图2、图3是已实现的该符号选择器组件截图。

图2 多边形符号选择

图3 线型符号选择

五、结束语

本文通过对ArcGIS Style符号库文件存储结构、符号库文件读取结构和各级序列化接口的研究剖析,在Microsoft framework.NET环境下设计并开发了ArcGIS Style符号库文件的符号选择器组件。该组件是一个独立的模块,可以独立运行,也可嵌入到其他基于ArcGIS Engine开发的应用系统中,能够方便地满足应用系统直接调用Style符号库文件的需求,具有较好的开放性和实用价值。

[1] 刘梅.地图符号学在数字制图条件下的应用[J].现代测绘,2009,32(4):59-61.

[2] 王哲.ArcGIS软件平台上基于基础地理信息数据库的地图符号化表达[J].现代测绘,2008,31(4):39-41.

[3] 张俊岭,熊卫东,夏斌.基于ArcEngine的地图符号制作工具研建[J].测绘科学,2007,32(5):86-87.

Research on Style Symbol Library Access and the Implementation of the Symbol Selector

FAN Wenfeng,WANG Huai,YE Fanghong

0494-0911(2011)11-0025-03

P208

B

2011-08-24

樊文锋(1970—),男,河北枣强人,工程师,主要从事航空与航天摄影测量、遥感、地理信息系统应用开发工作。

猜你喜欢
选择器序列化字段
图书馆中文图书编目外包数据质量控制分析
如何建构序列化阅读教学
74151在数据选择和组合逻辑电路中的灵活应用
DIV+CSS网页布局初探
四选一数据选择器74LS153级联方法分析与研究
Java反序列化漏洞探析及其修复方法研究
Java 反序列化漏洞研究
双四选一数据选择器74HC153的级联分析及研究
作文训练微格化、序列化初探
CNMARC304字段和314字段责任附注方式解析