基于ARCGIS批量统计打印软件的设计
摘要:本文讨论了基于ARCGIS的批量统计打印软件的设计目标和原则,进行系统的结构设计、关键技术的运用、软件功能模块设计以及系统的运行环境,并在项目的建设中得到了实现。
关键字:ARCGIS 批量统计 AO类接口
1.引言
1.1背景
2005年12月至2006年4月间,为配合北京市第三次交通调查即土地使用调查工作,进行了全市域1118个交通调查小区现状用地、总体规划用地数据调查与汇总统计工作。该项工作由于缺乏成熟的批量切割和统计软件,工作较为繁琐,且周期较长。此外,类似的批量用地统计的工作也日益增多,切实地需要定制一套针对规划数据的批量统计软件.由此为了提高工作效率,提出设计开发出基于ARCGIS的批量统计软件,实现对现状用地数据进行批量切割、批量统计及批量打印等功能。
1.2设计原则
1.2.1实用性
在尽量满足统计功能需求的前提下,应做到简单、实用、准确的原则。
1.2.2高效性
在软件设计、开发和应用时,应从统计需求、技术措施、软硬件平台、技术服务和维护响应能力等方面综合考虑,确保软件较高的性能。
1.2.3整体性
由于软件需要实现的功能包括三大部分:分区裁切、批量统计、批量打印,这就要求在把握全局性的基础上, 充分考虑各模块的需求, 使软件成为一个有机的整体, 从而进一步提高统计的效率、质量和水平。
1.3设计要求
u 软件开发需基于ARCGIS 9.0;
u 软件需实现批量切割各类规划数据;
u 软件需实现可选择的批量数据统计(参照统计范围计算属性中可计算的各种数据,含不同属性项的推导计算);
u 出图打印(统计数据自由排版并批量打印)。
2.技术路线
软件开发模式采用Client/Server方式,采用组件式开发技术Arcobjects结合Visual Basic开发语言进行软件的开发。
软件采用面向对象技术,基于ARCGIS软件平台,在ArcObjects+VBA环境中使用VB语言实现功能。其中ArcObjects是ArcGIS中应用程序ArcMap, ArcCatalog 和 ArcScene的开发平台,是用于构造ArcGIS系列平台的一个COM组件对象库,可以用来定制、扩展和构建GIS应用程序。通过ArcObjects可以实现空间数据的显示、查询检索、编辑和分析;创建各种专题图和统计报表;高级的制图和输出功能;空间数据管理和维护,甚至更多功能。VBA是单一的通用的应用程序脚本语言和环境,是VB基本语言引擎,与VB的代码大部分可以相互复制。
3.关键技术
3.1自定义结构体
在批量统计模块中,由于迭代计算过程很繁杂,所以在程序开发中就使用到了用户自定义结构体,用于传递中间计算值。在统计范围计算属性中的各种数据,含不同属性项的推导计算时,自定义了一个结构体用于传递在统计中将要用到的数值。与其他处理迭代计算的方法相比,自定义结构体起到了简化程序的作用,并且具有使程序更具有可读性的优点。
3.2 ADO和ADOX
在批量切割用地数据时, 需要将用地属性表导入ACCESS中,利用ACCESS的“窗体”透视表的制作功能进行批量统计;以及在批量统计时,必须将统计结果输出到用户设定的ACCESS中,同时生成用户所需要的MDB数据表和EXCEL表。这就需要使用到ADO和ADOX技术处理EXCLE和ACCESS的数据文件。
为了在软件中实现对EXCLE和ACCESS中数据的控制,使用到的ADOX的对象有:
1. Catalog:包含描述数据源模式目录的集合;
2. Column :表示表、索引或关键字的列;
3. Table:表示数据库表,包括列、索引和关键字。
使用到的ADOX的方法有:
1. Append(Columns):将新的 Column 对象添加到 Columns 集合;
2. Append(Tables):将新的 Table 对象添加到 Tables 集合;
3. Create:创建新的目录;
4. Item:按名称或序号返回集合的指定成员。
使用到的ADOX的属性有:
1. Active Connection:指示目录所属的 ADO Connection 对象;
2. Count:指示集合中的对象数量;
3. Name:指示对象的名称。
同样,要在开发工具中使用EXCEL,也需要在Visual Basic工程中引用。通过对EXCEL使用OLE自动化,可以创建出用户所需要的EXCEL表。
3.3 AO类接口
ArcMap和ArcCatalog类都是COM类,COM类用接口来组织属性与方法。类会有许多接口。ArcObjects提供了强大的接口功能,可以根据需求选择不同的接口。在分区裁切地块数据的模块中,按分区选择裁切时,需要根据用户需求对该分区边界处的地块是否按区界进行裁切,还要通过判断地块的质心是否落入该分区内从而选择裁切的方法。这就要求在ArcObjects所提供的接口中寻找符合用户需要的接口。举例如下:
u IBasicGeoprocessor接口
在按区界进行裁切时,在不需要判断地块的质心是否落入该分区内的前提下,用到了IBasicGeoprocessor接口下的Clip方法。IBasicGeoprocessor接口的功能主要提供了处理地理要素的方法,如:裁切、合并、打散、联合等。
u IArea接口和IRelationalOperator接口
在判断地块的质心是否落入该分区内时,首先用IArea接口下的Cenroid方法找出所在地块的质心,再用IRelationalOperator接口下的Within方法判断该地块的质心是否在所在区界之内。IArea接口提供了获取地块属性的方法,如:质心、标识点、范围等。IRelationalOperator接口提供了确定一个地块与另一个地块之间的关系的方法,如:包含、叠加、覆盖等。
4.系统功能设计
4.1分区裁切
4.1.1批量切割用地
u 实现功能
用地层沿界线层的边线批量切割。可选择界线层的全部地物,也可自定义选择部分地物。被切割的用地各类属性不变,面积和周长自动重新计算,并同时附上界线层用于批量切割的关键字属性。适用于仅进行用地性质和用地面积计算的批量统计,不适用于如容积率、建筑密度、人口密度等会随着几何形状的改变而发生无法预测的变化的属性字段的批量统计。批量切割用地的成果,是GeoDatabase数据库下的一批Feature Class,每一个Feature Class以界线层用于批量切割或批量选择的关键字属性值命名
u 实现思路
通过界面获取界限层和用地层的图层,用AO接口IBasicGeoprocessor下的
Clip方法实现对用地层的裁切。裁切部分按分区界的界限边界进行裁切,在各类用地属性不变的前提下,重新计算裁切出地块的面积和周长,并同时附上关键字的属性值。
在重新计算裁切出地块的面积时,用AO接口IArea下的Area方法可直接得到该地块的面积;在计算裁切出地块的周长时,用AO接口ICurve下的Length方法获取该地块的周长。
4.1.2批量选择用地
u 实现功能
用地层按照界线层的边界批量进行“质心包含”选择,可选择界线层的全部地物,也可自定义选择部分地物。用地层各类属性都不变,并同时附上界线层用于批量选择的关键字属性。适用于除用地面积以外的数值型属性的统计。缺点是批量选择的用地层的地物与界线层的地物仍存在犬牙交齿的情况,不是完全包含。批量选择用地的成果,是GeoDatabase数据库下的一批Feature Class,每一个Feature Class以界线层用于批量切割或批量选择的关键字属性值命名。
u 实现思路
为了按要求实现批量选择用地的成果是GeoDatabase数据库下的Feature Class,特设计了子函数Function CreateAccessDatabase( sDir As String, sDBName As String, bOverwrite As Boolean) As Iworkspace,用于创建一个新的AccessDatabase。利用AO接口IfeatureWorkspace下的CreateFeatureClass方法来创建最终成果的FeatureClass,其中FeatureClass的Field字段都已添加好.
再通过界面获取界限层和用地层的图层,首先用AO接口IArea下的Cenroid方法找出用地层地块的质心,再用IRelationalOperator接口下的Within方法判断用地层地块的质心是否在所选择的界限内。如果界限包含用地层地块的质心,则被选入该界限内的;如果用地层地块的质心在界限之外,则不被选入该界限中。
4.2批量统计用地
4.2.1批量统计用地
u 实现功能
通过界面选择将要批量统计的图层、分区界图层以及关键字段,实现对于每个分区的用地图,都要按照某一个属性字段,如“UTL”,或“HEI”来统计另一个数值型属性字段,如“SHAPE_AREA”,或“ARR*VOL”,并生成各分区用地统计表。
u 实现思路
该模块功能的目标是实现对于每一个分区的用地图,都要按照某一个属性字段来统计另一个数值型属性字段,这就要求必须对已有数据进行查询选择的处理。由于现有数据十分庞大,所涉及到的迭代计算过程很繁杂,所以使用用户自定义结构体来实现对计算中间数据的存储和传递。在统计如“ARR*VOL”这样的要求灵活多变的计算公式时,在开发过程中使用到了类模块来实现对于算式各项的控制。
1. 自定义结构体的设计
在统计UTL的各大、中、小类时,自定义了Type landUTLArea结构体,其中包含了LandBigArea() as LandUTLArea、LandMidArea() as LandUTLArea、LandLitArea() as LandUTLArea和对于用地面积、建筑面积、以及各用地面积和建筑面积占总面积的百分比的统计。在后面的程序中调用自定义结构体也十分方便,把已统计出的数值存放到对应的结构体的各项中,在需要的时候直接调用即可。
2. 类模块的设计
在统计较为灵活的属性字段时,需要利用函数Public Property Get() as Variant和函数Public Property Let() as Variant将用户的选择传入到类模块中。
为了实现对计算公式的控制,设计了子程序Public Sub AddStatFldName(oFieldList As ListBox)用来判断计算公式。另外,还设计了子程序Public Sub AddStatValue(pfeatureclass As IFeatureClass)用于实现对用户所选择属性字段的统计。在该子程序中也用到了自定义结构体来存放各属性项的统计值。
3. ADOX和ADODB技术的设计
对于每个分区的用地图,都要求生成各分区用地统计表,其中包含mdb和exl表。为了实现先生成mdb的统计表,再生成exl的统计表,运用到了ADOX技术。在新建立mdb表时,用到了ADOX方法下的Catalog 和Table,用于实现对目录的控制及新建表格,另外利用ADODB方法下的Connection和RecordSet来连接数据库和在mdb表中写入数据。在类模块中也使用到了ADOX和ADODB技术来创建和生成最终成果的mdb统计表。
在生成exl统计表时,设计了子函数Function ExportToExcel(rcd As ADODB.Recordset, sFileName As String, Optional iRows As Integer = -1) As Integer用于实现将mdb表转为exl表。
为了在“批量打印”模块中易于打印,若统计表记录行数大于20以上的,以20行为限进行分页,这就需要在程序中先判断是否大于20行,如大于20行从而将统计表分页。
由于“批量统计用地”模块是“综合统计用地”和“极值统计用地”模块的数据基础,这就要求在数据的统计时要具有高度准确性。
4.2.2综合统计用地
u 实现功能
将“批量统计用地”生成的各分区用地统计表集成为用地综合统计表,以便宏观的比较各分区的各类性质。
u 实现思路
在“批量统计用地” 生成的各分区用地统计表的基础上,对已统计出的数据进行整合处理,利用ADOX和ADODB技术来获取已统计出的MDB表中的数据以及对新生成的MDB表中行和列的控制,根据需要生成新的用地综合统计表,最终实现对各分区的各类性质的宏观比较。同样,为了在“批量打印”模块中易于打印,若统计表记录行数大于20以上的,以20行为限进行分页,这就需要在程序中先判断是否大于20行,如大于20行从而将统计表分页。
4.2.3极值统计用地
u 实现功能
实现分区中各种数值型属性项的极大值、极小值的查询与在地图中的定位,以及对各种数值型属性项的总和和平均值的计算。
u 实现思路
在“批量统计用地”所得出的数据的基础上,根据所选择的数值型属性项统计出极大值、极小值、总和以及平均值。处理在界面中定位极大值或极小值时,使用了AO接口IGeometry、IEnvelope下的Envelope方法来实现对于所定位边界的控制,并使用IMxDocument接口下的ActivatedView方法使所选区域高亮显示,更易于查看。
4.3批量打印
u 实现功能
实现A4、A3横向、纵向的多种方式布局,可根据专题图图名中的关键字,替换专题图中分区用地图和统计表;
实现批量打印,可一次打印排版方式相同的一批图;
实现批量生成JPG图像文件,以便在文本文件制作中引用。
u 实现思路
针对A3横向、A3纵向、A4横向、A4纵向等四种布局方式,分别做成一个MXD文件。
1.横向布局的设计
横向的布局如下图:
该布局的界面共包括四个数据框架(dataframe):分区规划用地图、分区用地位置示意图、图例以及统计表的数据框架。
为了实现分区用地数据源的自动替换,特设计了子程序changeRource (QuName As String),利用IfeatureLayer接口的FeatureClass属性,直接替换为要求的分区用地数据。同时设计了函数:
Function ReSymbolize(pFeatcls As IFeatureClass, pLyr As IGeoFeatureLayer, qName As String) As Boolean来实现根据用户要求的字段对替换后的分区用地数据进行重新符号化。其中用到接口IuniqueValueRenderer,根据唯一属性值进行符号颜色的配赋方法来实现。根据重新符号化的结果刷新图例,则使用IlegendFormat、IlegendClassFormat、IlegendItem等接口进行图例相关信息的设置。
另外,还设计了插入统计表的子程序insertExl和插入替换标题文字内容的子程序insertText(QuName, FileName)。其中插入统计表的子程序用到ImxDocument接口的InsertObject方法;并根据放置统计表的数据框架的大小对所插入exl表的大小进行调整,实现的方法是:首先根据插入exl表的长宽比例换算出插入表符合数据框架大小的Envelop,再将此Envelop赋给指向该表的pElement对象的Geometry属性。
最后再根据用户需要进行图片的输出或打印,使用IActiveView接口的Output方法实现。图片输出是设计子程序ExportPic(FileName)来实现的。
2.纵向布局的设计
纵向的布局如下图:
该布局的界面包括两个数据框架(dataframe):分区用地位置示意图和统计表的数据框架。
首先调用替换分区地块数据源的子程序changeRource (QuName As String);
插入统计表时,若统计表记录行数大于20以上的,以20行为限进行分页,这在进行批量统计输出统计表时就已进行判断而将统计表分页。在根据分区号进行统计表的插入时,需要首先判断该分区共有几个表,再判断哪个表有分表,最后再顺序插入表,同时进行输出或打印。设计了insertText(Quname, FileName(k))、insertExl、ExportPic(FileName(k))等子程序来实现。
5.系统运行环境
5.1机器配置要求
CPU>=PVI-1.6G,内存>256M,硬盘>40G。
5.2系统软件要求
1. 操作系统Windows2000或WinXP的高端版本。
2. 数据库系统必须有MS Access2000、MS EXCEL2000。
3. GIS系统要求ARCGIS 9.0或以上版本。
4. 开发软件要求Visual Basic 6.0版的编程软件。
声明①:文章部分内容来源互联网,如有侵权请联系删除,邮箱 cehui8@qq.com
声明②:中测网登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,文章内容仅供参考。
加群提示:我们创建了全国32个省份的地方测绘群,旨在打造本地测绘同行交流圈,有需要请联系管理员测小量(微信 cexiaoliang)进群,一人最多只能进入一个省份群,中介人员勿扰