余为益, 胡 红, 陈春香
(1.上饶师范学院,江西 上饶 334001;2. 桂林工学院,广西 桂林 541004)
GIS矢量图层处理功能的MapObjects实现
余为益1,2, 胡 红1, 陈春香2
(1.上饶师范学院,江西 上饶 334001;2. 桂林工学院,广西 桂林 541004)
为避开专业GIS软件操作的复杂性,以一个基于MapObjects的校园地物资源管理系统的图层处理模块为例,探讨了应用型GIS中矢量图层创建、图层坐标系定义、图元绘制、图元编辑、图元删除等功能的具体实现方法。通过编程,用户可以轻松完成对矢量图层的各种加工处理,大大提高了用户对图形数据的处理效率。实验结果说明,MapObjects组件特别适合处理地理信息,具有强大优势。
MapObjects;地理信息系统;矢量图层;坐标系
在使用GIS系统进行工作的过程中,人们经常需要做创建图层、删除图层、给图层定义坐标系,添加、修改或删除图元这样一些操作。关于这些操作和功能,很多专业GIS软件都有提供。但由于大多数专业GIS软件本身功能种类繁多,操作复杂,且无法自由、方便、又有选择地将用户真正所需的功能嵌入到适于某一方面专用的应用型GIS系统中,因此在基于GIS的校园地物资源管理系统中,特别研制了一个用于矢量图层处理的功能模块,以避开专业GIS软件操作的复杂性,提高用户对GIS图形数据的处理效率。本文简要介绍了校园地物资源管理系统的开发技术和功能,并通过编程实现了矢量图层处理模块包含的各个功能。
MapObjects(简称MO)是一个性价比较高,功能较强的 OCX控件。它由一个称为 Map Control的 ActiveX控件和一系列可编程的ActiveX对象组成。在VC++、VB、Delphi等可视化开发环境中,只需在设计阶段将MapObjects控件插入工程,并对其进行编程、设置属性或调用方法或相应事件,即可实现丰富的地图信息系统功能,而且应用程序还能脱离专业GIS软件平台独立运行。以下是 MapObjects的主要功能和特点。
MO是按层的方式来组织和操纵地图数据的,即它将一副地图分解成多个可以互相叠加的透明图层,让每个图层代表整个地图的一个方面。所有图层加在一起构成图层集合(Layers)。在MO组件开发中,可以通过图层集合元素获得对任意图层的编辑、调用或管理。MO图层数据来源广泛,既可以是 GIS矢量图层,也可以是CAD图层,甚至影像数据。对于GIS矢量图层,如Shape图层,其内部统一用记录集(Recordset)来表达层中各地理对象(或称为图元,通常分点、线、面、文字等的对象)的图形及属性数据,如同关系数据库中的二维表一样,行表示地理对象,列表示属性。其中,“Shape”列以面向对象的技术封装了地理对象的图形信息;“FID”列记录了该对象在图层中的排列序号,是每个地理对象的唯一标识。其他属性列则存储了该图元其他的一些必要属性信息,称图元的内部属性信息。通过MO,可以像MIS对普通数据库表一样去管理、查询、分析、创建、编辑和删除这些记录集中的所有数据。
MO开发中,可通过数据表对象(MapObjects2.Table),运用MapLayer对象的AddRelate方法将图层和其他外部属性数据(库或表)连接,以使地理对象的空间数据(包括图形及内部属性数据)和外部的属性数据进行拼接整合,并产生一一对应关系。为此,MO常用的数据库连接接口有:微软的ActiveX Data Objects(OLE DB)、Microsoft Jet database engine databases(MDB)、Data Access Objects(DAO)。另外,MO还可以和ArcSDE数据库、ODBC数据库、ISAM数据库和INFO数据库等建立连接[1]。
图文信息互查是一般GIS系统都应该具备的功能。MO对此提供了一定的支持手段。可借助MO中MapLayer对象的以下三种方法先查得符合指定要求的记录集,再从纪录集中提取并显示用户想要的图形或属性信息。这三种方法分别是:①SearchByDistance(shape,tolerance,expression),按相应位置的范围搜索并返回符合空间查询条件的要素记录集;② SearchExpression(expression),按 SQL语句的条件从句搜索并返回符合要求的要素记录集;③ SearchShape(shape,searchMethod,expression),搜索并返回在空间关系上符合参数searchMethod所指条件,逻辑条件符合表达式expression要求的要素记录集[2]。
运用MO组件,用户可以对地理矢量图层及其上的图元、顶点,乃至样式、标注等进行随意的创建、编辑、删除,还可以为图层加上合适的坐标数据等。在所有图元当中,点图元是一种在地图坐标中具有X,Y坐标值的几何图形,你可以通过属性X,Y,Z读取或设置一个点的位置;而多边形或线图元都有一个或多个属性集合Parts,每个Parts由一个或多个Points对象构成,每一个Points对象又由多个点对象构成,它们代表线或多边形的一个个顶点,正因如此,GIS开发人员可从创建或修改点、点集、部件着手对线或多边形图元进行创建和编辑等的工作。
MO提供了多种自带工具,如利用图例控件MoLegend可以实现地图(图层)在地图控件Map中的加载、选定、移出、显示顺序调整、颜色或图例设置等的功能;还可进行各种各样的专题地图制作工作;添加灵活美观的标注(注解);通过投影和坐标变换按不同需要显示地图图层。
系统以 Shape文件存储校园地物的空间数据,以SQL Server存储地物的外部属性数据,利用 MO对地物对象的空间及属性数据的调用与处理技术,在Visual C++平台上实现图文信息皆可视的校园地物资源管理系统。
系统功能模块划分如下:
(1) 图层控制模块 实现地物图层在地图窗口中加载、显示、隐藏、移出、显示颜色设置等的功能,这是系统对地物资源信息实现图形化查询与分析的起点。为了尽量减少开发的工作量,系统引用MO自带的图例控件MoLegend简化了上述功能的实现。
(2) 图层处理模块 该功能模块主要用于帮助用户实现对地理图层、图元的各种加工与处理,是本文研究的重点。主要涉及的功能项有:图层的新建、图层坐标系定义、图元编辑、图元添加、图元删除等。
(3) 信息查询模块 提供由图元查询属性和自定义 SQL查询条件查询符合要求的图元这样两种方式的信息查询。前一种主要通过在地图窗口显示的图层上点击、拉框选取一个或几个图元,再通过程序自动搜索图元内、外部属性数据信息;后者则通过在某对话框中填写、定制SQL查询条件来定位、显示满足条件的图元外观和位置。
(4) 空间量测与分析模块 实现对图层上任意两点或两对象间空间距离的量测,和对某个地物的长度或面积进行量测的功能;分析功能包括对地物作缓冲区分析、制作包含重要数据的专题图等功能。
系统主界面布局如图1所示。
图1 系统主界面布局
Shape文件是 ESRI提供的存储地理数据的矢量形式。一个Shape文件对应于一个MapLayer图层,所以它又常被称作Shape图层文件。它由多个不同的文件共同组成,即后缀为.shp、.dbf、.shx、.prj、.sbn、.sbx 等的文件。后缀为.shp、.dbf、.shx的文件是构成Shape图层文件的基本文件;后缀为.prj的文件保存着Shape图层的坐标系信息,它反映了图层数据是否经过投影和如何被投影的详细信息,故常将其称为坐标系文件或投影元数据文件。图层坐标系通常分为两类:地理坐标系和投影坐标系。对于图层上各点的位置,地理坐标系使用经纬度来刻划,而投影坐标系则使用平面直角坐标(X, Y )来描述[3]。如果一个图层的 prj文件只包含地理坐标系信息,那么可以说该图层是未经投影的;否则,如果该图层的 prj文件包含有投影坐标系的信息(每一个完整投影坐标系信息都必定含有一个地理坐标系的信息),那么说该图层是经过投影的。
以下分别介绍图层处理模块中各功能项的实现方法和过程。
方法:先创建并设置好新图层的 TableDesc对象,而后使用 AddGeoDataset方法产生一个GeoDataset对象,并加到一个DataConnection中,这样就可在DataConnection的SetDatabase方法指定的地图文件夹中产生了一个新的 Shape图层。主要实现代码示例如下:
应用上述方法只能得到基本的图层文件,并不能得到图层的坐标系文件。为图层间实现有效的数据交换、配准、共享,以及对其进行基于地理位置的处理和分析,就必须给新建的图层配以合适的坐标系信息。为此,MO不仅提供了一系列预定义坐标系,还提供了其他一些对象来支持地图或图层的坐标系定义,如投影坐标系(CMoProjCoordSys)、地理坐标系(CMo GeoCoo rd Sys)、投影(CMoProjection)、基准面(CMoDatum)、测量单位(CMoUnit)、椭球体(CMoSpheroid)、本初子午线(CMo Prime Meridian)和地理坐标转换(CMoGeoTransformation)等对象[4],并为这些对象的不同模型、不同方法、不同参数定义了一些常数。GIS二次开发人员可利用这些对象以及对象的属性、方法和常数,方便地在标准的Windows编程环境中实现图层任意坐标系的定义与变换[5],为图层生成特定的坐标系文件,使图层具有合适的坐标系。以下是为Shape图层生成合适坐标系文件的两种方法。
·直接输出法
坐标系对象. Export (LPCTSTR OutName)。其中:OutName表示输出的坐标系文件名(含路径及后缀,主文件名必须和图层的主文件名相同);坐标系对象既可以是投影坐标系对象又可以是地理坐标系对象。构建坐标系对象的方法很多,以下以构建地理坐标系统对象theGC为例,对它们分别加以介绍。
(1) 引用现有图层坐标系信息构建。主要示例代码及过程如下:
//获取现有图层m_MapLayer的坐标系
CMoGeoCoordSys theGC; /*构建投影坐标系对象实例:CMoProjCoordSys thePrj; */
theGC.AttachDispatch(val);
(2) 用投影元数据文件构建。主要示例代码及过程如下:
(3) 利用预定义常数构建。
MO2为每个预定义坐标系编了一个号码(见MO常数表),让每个编号对应于一种预定义坐标系,因此可用这个编号构建预定义坐标系对象实例。示例代码如下:
CMoGeoCoordSys theGC; //创建一个接口对象Dispatch并与接口驱动连接
theGC.CreateDispatch(TEXT("MapObjects2.GeoCoordSys "));
theGC.SetType(4203); //直接用地理坐标系编号构建地理坐标系对象实例
//theGC.SetType(moGeoCS_AGD1984);//用枚举常量构建地理坐标系对象实例
为编程方便,MO2将各个预定义坐标系的说明文字及其编号组合成一个个字符串,并在MapObjects2.Strings中设计了专门的方法拣取这些字符串。如有需要,还可从拣取出的字符串中提取相应编号。示例代码如下:/
/拣取全部预定义地理坐标系字符串到geoStr
CheckOutNumb(geoStr,0); //从指定集合元素(第0个字符串)拣出坐标系的编号(4201)
还可以利用 Strings对象的其它方法得到和坐标系定义与转换相关的更多参数(地球椭球体模型、基准面、投影方法、地理坐标系、投影坐标系、地理转换、本初子午线、测量单位、投影坐标系统参数等),可对这些参数赋值或修改其值,构建出符合实际要求的投影或地理坐标系对象实例。有关示例代码,限于篇幅,不再详述。
· 变换输出法
如果图层现有的坐标系并不符合实际需要,那么可以通过对原坐标系进行变换并输出的方法为图层生成新的坐标系文件。该方法的使用格式是:Object.Export(outName,outCoordSys)。其中:Object为图层的记录集对象;outName表示图层文件名的字符串(含路径,但不带后缀)。原坐标系由原图层的坐标系文件提供,不许额外的参数,且原坐标系和变换后的坐标系类型都可以是CMoProjCoordSys或CMoGeoCoordSys。因此,该方法可以完成四种类型的坐标系变换,见图2所示。
图2 坐标系变换类型
图3是本系统进行图层坐标系定义的流程图。
图3 系统图层坐标系定义流程图
图元操作包括对图元或其顶点的绘制(增加)、位置移动、删除等。在这些操作中,除绘制操作外,其他都必须先在操作图层上选定一个图元或其中的一个顶点,以作为操作的对象。为此,可以在地图窗口控件 Map1的 MouseDown消息处理函数中添加如下主要代码,使用户可在操作图层用鼠标点选图元:
//单击当前图层选定目标记录集
//根据操作图层的类型获取选定的图形及其Id属性值
选定图元对象后即可对对象(或其顶点)作移位、删除、保存等的操作。用于实现图元移位的方法及步骤如下:
(1) 移位
(2) 保存
不管是什么类型的图元,它们移位后的保存方法都是一样的,即:
关于线、面图元的移位距离,本系统的做法是:将选定对象后在地图窗口鼠标单击点(pt0)的位置作为点图元移位的目标位置。因此xLength,yWidth分别是pt0的X、Y坐标值与原来选定对象时鼠标单击点X、Y坐标值的差值。这样设置的好处在于,能让用户将图元对象形象、准确地移位到用户鼠标单击的位置上,获得良好的交互性。
线、面图元顶点编辑的实现较为复杂,基本思路是:先将图层上所有特征图形放到一个数组中,在用鼠标点选顶点对象时,如果鼠标点(将其转换为地图单位的点)与某顶点对象的距离小于某个阀值,则认为是选定了该顶点对象,而后即可对该对象进行删除、移位等操作;保存时,先将特征数组中的图元添加到原图层,而后再将图层原有的图元数据予以删除,这样就得到了顶点编辑后的新图层,也即完成了一次顶点编辑操作。其中,主要用到的方法是:① pt.DistanceTo(LPDISPATCH shape),计算点pt到对象 shape的距离;② pts.Set(long index,LPDISPATCH Point),将线或面对象中某点集pts的点(序号为index)移位到目标点Point位置上;③ rst.AddNew(),向图层特征记录集添加新记录。图4是对图元顶点编辑的状态图。
图4 图元顶点编辑状态图
用于图元删除的代码是:SelectedRec.Delete(); //删除已选定的图形记录
绘制图元的实现方法是:在 Map的MouseDown消息处理函数中,运用Map控件的ToMapPoint,TrackLine,TrackPolygon 、TrackCircle、 TrackRectangle等方法画出图元,并将该图元添加作为图层纪录集中的新成员。主要示例代码如下:
为了向用户即时展示图层上任意操作的过程和结果,可以在地图对象Map的消息响应函数AfterTrackingLayerDraw中调用 Map的DrawShape函数用不同于图层的颜色对选定或操作的各种对象进行重绘,突出显示。
地理图层加工处理的效率是应用型 GIS系统的重要因素。本文通过MO编程,实现了校园地物资源管理系统中矢量图层创建、图层坐标系定义、图元创建、图元编辑、图元移位、图元删除以及图元顶点的增加、移位、删除等的功能。利用系统的这些功能,用户可以轻松完成对矢量图层的各种处理,大大提高了用户对矢量图形数据的处理效率,同时使MO组件处理地理信息的强大优势得到了很好的体现。今后还要进一步加强和优化系统后台数据库的建设,对地物资源的外部属性数据进行补充和完善,以便在系统中更好地实现以图形化方式浏览和管理地物的所有属性数据或基于这些数据创建各种各样的专题渲染地图。
[1]薛 伟. MapObjects——地理信息系统程序设计[M].北京:国防工业出版社, 2004. 207-209.
[2]徐苏维, 盛业华, 黄家柱, 等. 基于 MapObjects的GIS综合应用开发[J]. 计算机工程与应用, 2006, (1):194-197.
[3]周卫娟, 张成刚. GIS软件坐标系统剖析[J]. 现代测绘, 2007, 30(2):13-16.
[4]韩 鹏. 地理信息系统开发—— MapObjects方法[M].武汉:武汉大学出版社, 2004. 77-80.
[5]张宏群. 基于组件式GIS的资源环境信息系统研究[D].贵阳:贵州师范大学, 2004.
Realization of the Function of GIS Layer’s Processing with MapObjects
YU Wei-yi1,2, HU Hong1, CHEN Chun-xiang2
( 1. Shangrao Normal College, Shangrao Jiangxi 334001, China; 2. Guilin University of Technology, Guilin Guangxi 541004, China )
To avoid the complexity of special GIS software, this paper, taking the GIS layer processing module in a campus ground object resources’ administration system based on MapObjects for instance, discusses the method of how to realize the function of GIS layer’s processing. The effective programme can help users to complete the processing of vectorgraph layers easily, improve the efficiency greatly. The experiment results showed that the MapObjects’s functions are very suitable for processing geographic information, and is of strong advantage.
MapObjects; geographic information system; vectorgraph layer; coordinate system
TP 311;P 208
A
1003-0158(2010)06-0012-07
2009-03-07
上饶师院科研基金资助项目(2008015)
余为益(1976-),男,江西上饶人,讲师,硕士,主要研究方向为GIS二次开发与数据库应用技术。