APP下载

理解ArcObjects对象模型,编写林业规划功能程序*

2017-08-10丘国文

福建林业 2017年1期
关键词:图层代码小班

丘国文

(福建省上杭县林业局,福建杭州364200)

理解ArcObjects对象模型,编写林业规划功能程序*

丘国文

(福建省上杭县林业局,福建杭州364200)

理解ArcObjects常用对象模型,掌握其接口、属性和方法,目的在于编写程序,扩展ArcMap潜在功能,高效、准确实现林业规划及图层修正更新工作。

林业规划;ArcMap;ArcObjects对象模型;编程

目前,ArcGIS已成为林业制图软件的主流产品,虽然它有丰富的系统工具,但还是满足不了不同行业个性化的需求,若要在不同图层之间分析的工作,即使能利用其系统工具,有时不能一步做成,还需要生成许多中间图层逐步过渡才能做出来。ArcMap嵌入了VBA后结合ArcObjects,也能象Word、Excel、Access中的VBA一样,很方便定制ArcGIS里的应用工具,弥补其系统工具功能的不足。ArcObjects是ArcGIS的开发台,ArcObjects建立在微软的组件对象模型(Component Object Model,COM)技术之上,是微软产品中系列中的通用编程语言。VBA(Visual Basic for Applications)是支持COM的编程语言。本文结合“省级以上重点生态公益林区位图绘制”工作实例,基于VBA的ArcObjects编程,探寻实现两层之间的空间选择新方法。

1 基础资料准备

1、林业基本图(资源管理部门提供);2、省级以上重点生态公益林区位图(简称规划图),上杭县国家级重点生态公益林区位有:5亿立方米以上大型水库(棉花滩水库)周边一重山和梅花山保护区。省级生态公益林生态区位有:汀江河干流、黄潭河干流、旧县河干流一重山、交通干线一重山、饮用水水源保护区和森林公园的林地。

2 应用需求分析

规划图只是基于卫片影像图和地形图,根据自然地物地貌的特点及其空间位置来区划勾绘的,与基本图没有必然关联,最终还要将规划内容落实到这些区域的林业基本图小班中去。按一般性操作,首先用空间连接工具将林业基本图与规划图进行空间位置连接,生成过渡性的空间连接图层,沿规划界线检查,若发现问题,还得调整规划图,重复操作一面,而中间过渡性图层并非我们所要的结果,却要占用存储空间资源。

类似的重复性工作在林业规划中是经常要做的工作,如湿地生态红线规划、保护区生态红线规划及每年度资源建档变化小班图斑的批量修正更新,共同点是需要规划图(或更新图层)与基本图之间比较分析、逻辑运算、属性表之间数值传递等操作。编写程序代码,完成相类似林业规划工作,既不产生中间过渡图层,又能完成重复性工作。

3 理解图层和数据集相关的ArcObjects

3.1 对象模型的层次结构

一个对象代表一个空间要素,如村部位置、道路中心线或植被斑块,图1显示了ArcMap中的地图对象和图层对象的层次结构,最顶层是Application(在这里是ArcMap),它由MxDocument对象构成,MxDocument对象由Map对象构成,Map是地图对象,表示一张地图或者一个数据框架,而Layer对象表示地图中的要素型图层。Map对象表现为数据框架。图层,举例来说,包括林业矢量图(林业基本图)、栅格图(如卫片和地形图)。

ArcObjects的Geodatabase子系统包括数据集对象和数据源对象的层次结构如图2,数据集对象的一个对象对应着表中的一行,而表中的列则记录对象的属性;数据源对象用于程序按指定路径遍历硬盘中数据集并添加到当前地图。顶层是WorkspaceFactory用于调用文件夹、个人Geodatabase和文件Geodatabase等,工作区对象(Workspace)是不同数据的一个容器,Dataset的类型有GeoDataset(地理数据集)和Table(表)两种类型。Geo-Dataset包括要素图层、要素类、栅格数据集和栅格图层。Table对象是在表中存储属性的行的集合。例如,Table对象,包括文本格式的表、dBASE格式的表。

图1 MrcMap中Application、MxDocument、Map以及Layer类的层次结构

图2 Geodatabase中WorkspaceFactory、Workspace以及Dataset类的层次结构

ArcObjects对象模型很多,本文对案例的代码中涉及的对象模型介绍,有助于理解案例中的代码。

3.2 对象和类的接口

ArcObjects对象在VBA中不能直接引用,而是通过某个接口来访问,有了接口才得以编程访问数据并执行任务。例如经常用变量PFeatureLayer指向某一图层FeatureLayer对象是通过IFeatureLayer接口或IFeatureSelection接口来访问FeatureLayer对象,而不是直接访问对象本身,如图3所示。PFeatureLayer的第一个字母P通常表示这是一个指针变量;IFeatureLayer和IFeatureSelection中第一个字母I通常表示这是个接口。字母的大小写使其更易理解,这是对面向对象技术编程中的命名习惯。更确切地说,接口允许程序员使用该接口提供的属性和方法。

图3 FeatureLayer对象支持IFeatureLayer接口和IFeatureSelection

3.3 对象的属性和方法

ArcObjects对象提供了丰富的内建属性和方法,调用其对象及对象现有的属性和方法,可减少大量的编程工作。对象的属性可能是数值,也可能是又一个对象,在对象模型中,很多对象是组件类,可以直接创建一个对象,当开发者使用Set、New关键字创建一个几何对象后,其实是空的,它需要添加具体的属性信息。FeatureLayer对象若是通过IFeatureSelection接口来访问,带来的便利是:可利用IFeatureSelection接口的SelectFeatures方法结合筛选器对象来选择要素,并高亮显示。空间筛选器对象(SpatialFilter)能够同时包括空间空间条件和属性条件进行数据查询,该对象具有两个重要的属性:Geometry属性和SpatialRel属性。Geometry属性定义用于筛选结果的几何形状。该几何形状可以是要素图层上一个多边形,也可以是由用户绘制的几何外框,如本案例中棉花滩水库周边一重山外围规划界线,或者交通干线的一个缓冲区。SpatialRel属性定义用于选择的空间关系。ArcOjects有10个预先定义的空间关系(图4)。引用对象的方法会执行特定的操作,可以理解为调用该对象私有过程(程序),引用对象的属性和方法。

选择正确的接口,获取需要的属性和方法是实现ArcObjects编程的核心内容。

图4 ArcObjects中预定义的空间关系可选常

4 代码的编写

4.1 开发环境

在ArcGIS中安装了VBA(Visual Basic for Applications)编程器后,可选择自定义菜单下的VBA宏,再选择Visual Basic编辑器,打开Visual Basic编辑器,插入模块,就可编写程序了,在定义变量的数据类型时,输入关键字As、New和一个空格后VB编辑器则自动用下拉式列表框显示可用数据类型或对象接口,如图5a所示;在对象变量后输入一个点,VB编辑器则自动用下拉列表显示对象的可用的属性和方法,输入前几个字母逐步缩小选择范围(图5b);在VBA编辑器中打开对象浏览器,可以很方便地查看对象及其属性、方法、常量、变量,还可以用它来查看本工程内使用既有的对象,如图5c所示,左窗口为对象列表,右窗口显示了选中对象所拥有的属性和方法。享受友好的开发环境,自动完成的代码都能识别顺利运行,调试保存后,自动保存在normal.mxl(模板文档)上。

图5 a定义变量输入As和空格后,下拉式列表框中逐步筛选显示数据类型、对象接口

图5 b对象变量后输入点,出现下拉式列表框,显示该对象可用的属性和方法

图5 c打开对象浏览器,查找对象、属性、方法

4.2 代码编写

4.3 代码要点

代码运行错误时,运用对象Err提示错误类型并结束。假设,规划图.shp和林业基本图.shp及地形图已添加到当前地图,需要查询基本图中被规划图所包含的所有小班。变量pQueryFeatLayer和pFeatLayer分别指向林业基本图和规划图,便于调用。

通过GeometryBag类来实现IGeometryCollection接口对象,接着,代码利用IFeatureClass接口上的Search方法,创建了由pOutFeatureCursor所引用的要素游标。通过GeometryCollection类实现IGeometryCollection接口对象,代码用一个Do……Loop循环,用IFeatureCursor对象接口的NextFeature方法来逐个访问pOutFeatureCursor(规划图所有要素,本案例只是模拟,只有一个要素),利用IGeometryCollection接口对象的方法AddGeometry方法把图形信息添加进去,长整型变量Count用于规划图层要素计数。

创建ISpatialFilter接口对象来设置空间查询逻辑运算,本例空间关系设为esriSpatialRelContains方式,即选择要素完全包含在几何形状内,可选空间关系有10种,选用不同参数完成不同空间查询方式。

通过FeatureSelection获得IFeatureSelection接口实例,最后调用IFeatureSelection接口对象的SelectFeatures方法将结果高亮显示。

代码用With……End With来减少访问对象的次数,加快运行速度。一致的缩进格式使嵌套级别更具层次感,增加了代码的可读性。

4.4 代码运行及后期加工处理

将规划图层和林业基本图(命名为“林业基本图.shp”,与代码中图层名称一致;也可将代码中文件名“林业基本图”按实际名称替换)两个图层添加到数据图层中,并确保两个图层排在图层内容列表的最顶部,将代码复制到模块里。按F5运行代码后,效果如图6a,因图幅所限,红线只是模拟上杭县棉花滩水库国家级重点生态公益林区位规划图层的局部位置,规划图层(图中红色)所包含林业基本图小班全部被选中。如图6b,林业基本图小班属性表显示了125个小班同时被选中。按规划方案要求水库周边一重山都要规划进去,沿规划图边沿检查是否存在多选或漏选小班,若存在,还要对规划图作细微调整,重新运行代码,重新查询规划图所包含小班,如此反复检查直到正确为止,然后对选中的小班导出数据,添加规划名称字段,用字段计算器做上规划标记(如区位名称或区位代码),批量处理,既不会出错,效率又高。用删除字段工具整理属性表字段,使之与全省统一要求矢量图数据结构相一致后提交成果。

图6 a两个图层之间空间选择

图6 b属性表显示125小班选择中

5 程序应用的扩展

若对代码做小小的改动,修改图层逻辑运算就可以扩展其它功能,图层间运算如改为对重叠空间进行修正更新就可实现资源建档中小班区划图斑批量修正更新,对小班边界有重新区划过的小班制作更新图层,制作更新图层时,保留原小班边界要用追踪工具生成,确保无缝隙,修正更新后不致生成碎斑。

6 小结

基于VBA的ArcObjects对象模型编写程序,必须有VBA的编程基础,必须熟悉掌握ArcMap软件一般操作和ArcObjects对象模型,ArcMaP提供了丰富的对象模型,掌握对象模型不容易,本文只能对与规划功能有关的对象模型作简要介绍。本案例代码解决了在规划图层初步做好后,能高效地反复检查和调整规划图层,批量地对小班做上规划标记。

[1]Kang-tsung Chang.基于VBA的ArcObjects编程——面向任务的方法[M].北京:科学出版社,2010.

[2]傅仲良.ArcObjects二次开发教程[M].北京:测绘出版社,2008.

[3]兰小机,刘德儿,魏瑞娟编著.基于ArcObjects与C#.NET的GIS应用开发[M],北京:冶金工业出版社,2011.

责任编辑/罗美娟

Understanding the ArcObjects Model and Editing the Forestry Plan Function Program

Qiu Guowen
(Shanghang County Forestry Bureau,Shanghang Fujian 364200,China)

S747.5

:A

1003-4382(2017)02-0040-05

2016-5-10

2016-07-12

丘国文(1968-),男,福建上杭人,林业工程师,主要从事林业调查规划设计、营林绿化及林业技术推广工作。

猜你喜欢

图层代码小班
小班教学 有效交流
如何在幼儿园小班开展区域活动
创世代码
创世代码
创世代码
创世代码
巧用混合图层 制作抽象动感森林
图层法在地理区域图读图中的应用
跟我学添加真实的光照效果
小班幼儿语言交往能力的培养