中南大学GIS开发指导书_第1页
中南大学GIS开发指导书_第2页
中南大学GIS开发指导书_第3页
中南大学GIS开发指导书_第4页
中南大学GIS开发指导书_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

GIS二次开发实验指导书

(ArcGIS9.3——VBA/AO/Engine开发教程)

张宝一

csuzby@

中南大学GIS研究中心

用扁一

宏语言式二次开发

(ArcGIS9.3/VBA)

实验一创建VBA宏与UIButtonControl

实验目的

通过ArcMap的VBA环境下编程,初步了解ArcObjects组件库,力

求能读懂、理解VBA实例程序,基本了解宏语言式GIS二次开发的基

本思路和方法。

实验内容

1.在ArcMap地图文档中添加一个VBA宏,实现对某一图层的唯一

值渲染;

2.在ArcMap地图文档中添加一个UlControl按钮,打开一个“虫眼”

窗口。

实验学时

2学时。

实验步骤

设置VBA编译环境(显式声明),输入代码

OptionExplicit

内容一:写VBA宏(直接在VBA编辑器中编辑函数和过程)

1、创建宏,并启动VBA编辑器

2、在地图文档中Project中编写宏(函数或过程)

3、在Macro对话框或VBA编辑器中运行VBA宏

设置层UniqueValueRenderer

本例要实现的是如何在一个层中设置UniqueValueRenderer,根据属性

字段填充上不同的颜色的polygon;首先实例化接口IGeoFeatureLayer,

通过类UniqueValueRenderer实现lUniqueValueRender接口的对象实例,

通过对lUniqueValueRender的属在进行赋值,最后赋值给

IGeoFeatureLayer.Render属性

参考代码如下:

DimpMxDocumentAsIMxDocument

DimpMapAsIMap

DimILyrCntAsLong

DimILyrAsLong

DimpLyrAsILayer

DimpGeoFeatLyrAsIGeoFeatureLayer

DimpUniqueValueRAslUniqueValueRenderer

DimpTableAsITable

DimIfieldNumberAsLong

DimpColorRampAsIRandomColorRamp

DimpEnumRampAslEnumColors

DimpNextUniqueColorAsIColor

DimpQueryFilterAsIQueryFilter

DimpCursorAsICursor

DimpNextRowAsIRow

DimpNextRowBufferAsIRowBuffer

DimcodeValueAsString

DimpFillSymbolAsIFillSymbol

SetpMxDocument=ThisDocument

SetpMap=pMxDocument.FocusMap

ILyrCnt=pMap.LayerCount

ForILyr=0ToILyrCnt-1

SetpLyr=pMap.Layer(ILyr)

IfpLyr.Namc="xianjie_changsha_9"Then

SetpGeoFeatLyr=pLyr

ExitFor

EndIf

NextILyr

SetpUniqueValueR=NewUniqueValueRenderer

SetpTable=pGeoFeatLyr

'Afieldfortheshapefile

ConststrNameField="Name'1

IfieldNumber=pTable.FindField(strNameField)

IfIfieldNumber=-1Then

MsgBox"Can'tfindfieldcalled"&strNameField

ExitSub

EndIf

•pUniqueValueR.FieldCounl=1

,pUniqueValueR.Field(O)=strNameField

,SetpColorRamp=NewRandomColorRamp

,pCoIorRamp.StartHue=0

•pCoIorRamp.MinValue=99

,pCoIorRamp.MinSaturation=15

•pColorRamp.EndHue=360

,pColorRamp.MaxValue=100

•pColorRamp.MaxSaturation=30

,pColorRamp.size=100

•pColorRamp.CreateRampTrue

•SetpEnumRamp=pColorRamp.Colors

•SetpNextUniqueColor=Nothing

•SetpQueryFilter=NewQueryFilter

,pQueryFilter.AddFieldstrNameField

,SetpCursor=pTable.Search(pQueryFilter,True)

,SetpNextRow=pCursor.NextRow

,DoWhileNotpNextRowIsNothing

,SetpNextRowBuffer=pNextRow

,codeValue=pNextRowBuffer.Value(lfieldNumber)

,SetpNextUniqueColor=pEnumRamp.Next

,IfpNextUniqueColorIsNothingThen

,pEnumRamp.Reset

,SetpNextUniqueColor=pEnumRamp.Next

•EndIf

•SetpFillSymbol=NewSimpleFillSymbol

•pFillSymbol.Color=pNextUniqueColor

,pUniqueValueR.AddValuecodeValue,,u,,pFillSymbol

•'Advancethecursortothenextrow,orendofthedataset

•SetpNextRow=pCursor.NextRow

•Loop

*'Nowsetthelayersrenderertotheuniquevaluerenderer

•SetpGeoFeatLyr.Renderer=pUniqueValueR

•pMxDocument.ActiveView.Refresh

,pMxDocument.UpdateContents

运行效果图如下

〜无标StIWcMap-AtelnTo

内容二:创建UlContro】(交互式VBA编程)

1>Customize对话框的“Commands"页,选中"UlControls”后点击66亚

UlControb按钮

2、选择UlControl类型:

UIButtonControl:创建Button;

UIToolControl:创建与Map交互的Tool;

UIEditBoxControl:创建EditBox;

UIComboBoxControl:仓U建ComboBox。

3、进入VBA编辑器在UlControl的事件中进行VBA编程

4、添加一个工具条,选中UlControl并将其拖置到工具条上。

ToolbarX

ToolbarName:

|VBASamplesl

H]

V.®

OKCancel

参考代码如下:

•'运用这个子程序生成了一个新的放大镜窗口,在本例中将放大率设定为200%

,SubCreateMagnifierWindow()

,DimpMapInsetAsIMapInset

,DimpMapInsetWindowAsIMapInsetWindow

,DimpDataWindowFactoryAsIDataWindowFactory

,SetpDataWindowFactory=NewMapInsetWindowFactory

,IfpDataWindowFactory.CanCreate(Application)Then

,SetpMapInsetWindow=pDataWindowFactory.Create(Application)

,SetpMapInset=pMapInsetWindow.MapInset

,'Setthezoompercentto2(X)%

,pMapInset.ZoomPercent=200

,pMapInsetWindow.ShowTrue

・EndIf

,EndSub

运行效果图如下

实验要求

1.使用基础实习成果数据(或其他示例数据)

2.完成实验要求的两个实例(最好要有自己的内容)

3.将代码保存在一个地图文件MXD中,上交后方可离开实验室(如

未完成可在课下通过邮件提交)

实验二创建VBAUIToolControl

实验目的

通过ArcMap的VBA环境下编程,初步了解ArcObjects组件库,实

现GIS的基本窗口操作,了解宏语言式GIS二次开发的基本思路和方法。

实验内容

1.在ArcMap地图文档中添加一个UlControl工具,实现对地图的拉

框和点击放大;

2.在ArcMap地图文档中添加一个UlControl工具,实现对地图的鼠

标移动。

实验学时

2学时。

实验步骤

设置VBA编译环境(显式声明),输入代码

OptionExplicit

内容一:窗口放大

用户点击按钮后,可以在地图上进行点击或者拖放矩形框来放大地图

因为考虑到用户可以单击放大,©可以拖放矩形框来放大,所以采用

INewEnvelopeFeedback接口来显示拖放矩形框效果。

IDiSDlavFeedbacklo

□INewEnvelopeFeedback:IDisplayFeedback

■-■AspectRatio:Double

ThenewenvelopeMlConstraint:esriEiivelopeConstraiiits

Y-Start(inPoint:IPoiirt)

feedbackisperhapstheStop:(Envelope

mostusefijlandsim­日IDisplayFeedback:IUnknown

—□Display:IScreenDisplay

plestofthefeedbacks.Symbol:(Symbol

Itisusedtoallowthev-MoveTo(inPoint:IPoiirt)

+Refresh(inhDC:OLE_HANDLE)

usertocreateanew日IUnknown[hidden]

envelopeonthedisplay,knownas+AddRef

v-Querylnterface(inriid:GUID,outppvObj:Any)

9

^draggingarectangleRelease

接口INewEnvelopeFeedback有IDisplayFeedback派生。

接口IDisplayFeedback具有如下属性和方法:

Display:设置Feedback所利用的显示属性;

MoveTo:当鼠号移动时,设置鼠标点所在的坐标;

Refresh:刷新画面;

Symbol:设置显示风格。

Feedbacks对象可以划分为两类:

1.大部分是通过stop方法返回一个新的儿何

2.也有一些纯粹为了显示,开发者来计算一个新的几何,包括

MoveGeometryFeedback,MovelmageFeedback,NewMultiPointFeedback,

VertexFeedbacko

Displayfeedbackobjects

rn

।>•Bezi«rMove-NewB«zier-

CraalcaafwntMckPoint-Curve-

onthefta/WrrFeedbackCivtUaatMdDnckonttedeployFe>edbeck

mgvt^apctlanalor3tMr^ano*Bactorcurva

B»zkrctfV0

Callout-

Feedback

•ZnaixifMdZdconCreate*ateadEockanimdi

m•paylaracakMforanewt

Nt«Omn>ionF«Mb<ck

IS»tOGroup-Dim«nsfon-

CraatsearMdbKkcotteFeedbackCrartMatoedcockonthe/”,Feedback

«cragro(^tfteraddgnawdlnenienshapai

fKdMCkejects

LineMove-Envelcpe-

Pokit-

Croat-aiwctockonV»CTMtc*itKdEadc8gdphyfv

Feedback但.anowsn/dope

"layrefmovhjapotncna

2

O-

NewLine-

Fe«dback

I

Create*ateodt»:«cntr»■N/y

tot川叫anewE/

FMvWurParfHtdbuKc-

MultiPoint-

Ktv4ErwMcpaF»Mtn:io-Move-

CroatsafMlxickanlhddtapAiy,Feadback

Envelope-Kraddnganewmttfxlrt/

CsHM■r«e£Kkonn»dtapiyFeedback

KrtnoMnganfimaiop*

Cg。aiMdDadt

Geometty-toraddng

Feedbeck

MovePoirit-

LTMiM1roaltMCk8t!»dtptoyF«edfc«ck

lormovhgaparthapoygon

CtMte:afwx«:kco2wpaytot

mt»Eanhugecfcyneol&sdstemsrisIReiMpeF»Mt*»o-

orglx,

MoveLne-

Crvelao•fMdEMdcOH1h«。甲ayforFe«dback

nxMtgaInenR68120-

MovePoint-reccinganenvcicpt

Feedteck

0-■

CroatsafMabackcnthsdtaptiyformoMng!Vertex-

crouoaa!M<SO<»8m»cFeedback

n.ve«i>9Moraqeonwtiyty

图1显示反馈Feedbacks对象

具体步骤如下:

添加UIToolControl

添加模块级变量,参考代码如下:

Dimm_bIsMouseDownAsBoolean

Dimm_pPointAsIPoint

Dimm_pFeedbackEnvAsINewEnvelopeFeedback

修改箴标键按下事件,

-^1licrosoftVisualBasic-Changsha,axd-fThisDocaaent(代码)]KE®

文件0)编辑⑥视图叩独人Q)格式Q)0Q)运行®工具a)外餐程序㈤窗口量)港助QP

必豹-)fr79»Mli

ZoM»Oat

pFillSymbol.Color=

•雄d«rBal■■()

就Project(Ckaasska■>pUniqueValueR.AddValueeg矫

-对象'AdvancethecursortoL,’

国ThiiD«an«at

-T横成SetpNextRow=pCursor.小三赳

避模出LOOPg«€r«sb

班快2

Cj引用'NowsetthelayersrenderetlsiL

SetpGeoFeatLyr.Renderer=pUniqueValueR

pMxDocument.ActiveView.Refresh

pMxDocument.UpdateContents

EndSub_________________________________________

Th>SDOCM**RxDocunaat

技字母序|按分英序|PrivateSubZoomOut_Select0

EndSub

PrivateSubZoomWindow_C1ick()

DimpMapInsetAsIMapInset

DimpMapInsetWindowAsIMapInsetWindow

DimpDataWindowFactoryAsIDataWindowFactory

pDataWindowFactory=NewMapInsetWindowFactory

IfpDataWindowFactory.CanCreate(Application)Then

SetpMapInsetWindow=pDataWindowFactory.Create(Applicat.

SetpMapInset=pMapInsetWindow.Mapinset

'Setthezoompercentto200%

参考代码如下:

PrivateSubZoomOut_MouseDown(ByValbuttonAsLong,ByVaishiftAsLong,ByVaixAsLong,ByVaiyAsLong)

DimpActiveViewAslActiveView

DimpMxDocumentAsIMxDocument

・,鼠标左键按下

,Ifbutton<>1ThenExitSub

,IfpActiveViewIsNothingThen

,SetpMxDocument=ThisDocument

,SetpActiveView=pMxDocument.ActivatedView

•EndIf

♦'得到起始点

•Setm_pPoint=pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x,y)

・m_bIsMouseDown=True

•ExitSub

EndSub

修改鼠标移动事件响应函数,参考代码如下:

PrivateSubZoomOut_MouseMove(ByValbuttonAsLong,ByVaishiftAsLong,ByVaixAsLong,ByVaiyAsLong)

DimpMxDocumentAsIMxDocument

DimpActiveViewAslActiveView

,,鼠标移动:主要通过InewEnvelopeFeedback.StartPoint和MoveTo方法来绘制矩形框,然后赋值给

lActiveView.Extend属性,达到地图的放大缩小

•IfNotm_bIsMouseDownThenExitSub

•IfpActiveViewIsNothingThen

・SetpMxDocument=ThisDocument

・SetpActiveView=pMxDocument.ActivatedView

・EndIf

・Ifm_pFeedbackEnvIsNothingThen

・Setm_pFccdbackEnv=NewNewEnvelopeFcedback

・Setm_pFeedbackEnv.Display=pActiveView.ScreenDisplay

•m_pFeedbackEnv.Startm_pPoint

•EndIf

•Setm_pPoint=pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x,y)

,'DrawEnvelope

,m_pFeedbackEnv.MoveTom_pPoint

,ExitSub

EndSub

修改鼠标键弹起事件响应函数,参考代码如下:

PrivateSubZoomOut_MouseUp(ByValbuttonAsLong,ByVaishiftAsLong,ByVaixAsLong,ByVaiyAsLong)

DimpActiveViewAslActiveView

DimpMxDocumentAsIMxDocumcnt

DimpEnvAslEnvelope

・,鼠标左键弹起

•Ifbutton<>1ThenExitSub

,IfpActiveViewIsNothingThen

•SetpMxDocument=ThisDocument

•SetpActiveView=pMxDocument.ActivatedView

•EndIf

•If(m_pFeedbackEnvIsNothing)Then

•'UserOnlyClickMapwithleftbutton

・SetpEnv=pActiveView.Extent

•果是缩小的话,将这里的两个0.5都改成L5

,pEnv.Expand0.5,0.5,True

•Else

*'UserDrawaEnvelope

,SetpEnv=m_pFeedbackEnv.Stop

•EndIf

,pActiveView.Extent=pEnv

•m_bIsMouseDown=False

,Setm_pPoint=Nothing

,Setm_pFeedbackEnv=Nothing

,pActiveView.Refresh

,ExitSub

EndSub

内容二:窗口移动

理户点击按钮后,可以拖动地图显示

采用lActiveView.ScreenDisplay.PanStart和PanStop方法使地图移动。

通过lActiveView.ScreenDisplay的PanStart和PanStop方法在ITool的

MouseDown,MouseUp和MouseMove事件的响应实现移动效果

添加模块级变量,参考代码如下:

Dimm_bIsMouseDownAsBoolean

修改前标键按下事件响应函数,参考代码如下:

PrivateSubPan_MouseDown(ByVaIbuttonAsLong,ByVaishiftAsLong,ByVaixAsLong,ByVaiyAsLong)

DimpMxAppAsIMxApplication

DimpScrDispAsIScreenDisplay

DimpStarlPointAsIPoint

♦鼠'标左键按下

•IfNotbutton=1ThenExitSub

•SetpMxApp=Application

,SetpScrDisp=pMxApp.Display.FocusScreen

,m_bIsMouseDown=True

,SetpStartPoint=pScrDisp.Displayrrransformation.ToMapPoint(x,y)

•'得到起始点,开始移动

,pScrDisp.PanStartpStartPoint

,ExitSub

EndSub

修改鼠标移动事件响应函数,参考代码如下:

PrivateSubPan_MouseMove(ByValbuttonAsLong,ByVaishiftAsLong,ByVaixAsLong,ByVaiyAsLong)

DimpMxAppAsIMxApplication

DimpScrDispAsIScreenDisplay

DimpMoveToPointAsIPoint

•'鼠标移动

,IfNotm_bIsMouseDownThenExitSub

,SetpMxApp=Application

,SetpScrDisp=pMxApp.Display.FocusScreen

,SetpMoveToPoint=pScrDisp.DisplayTransfonnation.ToMapPoint(x,y)

•'根据鼠标移动,移动地图

,pScrDisp.PanMoveTopMoveToPoint

,ExitSub

EndSub

修改鼠标键弹起事件响应函数,参考代码如下:

PrivateSubPan_MouseUp(ByVaibuttonAsLong,ByVaishiftAsLong,ByVaixAsLong,ByVaiyAsLong)

DimpMxAppAsIMxApplication

DimpScrDispAsIScreenDisplay

•'鼠标左键弹起

,IfNotm_bIsMouseDownThenExitSub

,SetpMxApp=Application

•SetpScrDisp=pMxApp.Display.FocusScreen

,m_bIsMouseDown=False

,pScrDisp.PanStop

・ExitSub

EndSub

实验要求

1.使用基础实习成果数据(或其他示例数据)

2.完成实验要求的两个实例(最好要有自己的内容)

3.将代码保存在一个地图文件MXD中,上交后方可离开实验室(如

未完成可在课下通过邮件提交)

见—^痫

客户化组件库扩展

(ArcGIS9.3/C#)

实验三AO组件库扩展

由于Arcinfo是完全COM化的,对于需要对Arcinfo进行结构定制和功

能扩展的高级开发人员来说,这非常具有吸引力。任何与COM兼容的编

程语言,如:C#,VisualC++,Delphi或VisuaU++都能用来定制和扩展

Arcinfoo一个扩展模块开发的基本步骤如下:

(1)新建工程,添加AO的引用;

(2)实现需要的接口,添加具体的代码;

(3)编译为DLL,注册该COM组件,并在ArcGIS的omponentcategories

注册(也可以使用界面的自定义对话框浏览定位到具体的dll来注册);

(4)测试和调试。

编写ArcGIS扩展,可以完成以下任务:

OCommand:即一个按钮、菜单,通过实现【Command、ITool>

IToolCommand接口来创建;

OEditTask:与ArcMapEditor协同工作的组件,需要实现lEditTask

接口;

OTableofContentstab:类似左侧的数据和图层视图的小窗口,通过实

现IContentsView接口来创建;

OClassextension:自定义对象(feature),即有自己属性和规则的空间

对象,例如红绿灯对象,电线,电闸等等,需要实现IClassExtension等

接口。

实验目的

脱离ArcMap环境而在VB/VC或C#开发环境中进行外部独立的开

发,初步了解ArcObjects组件库,力求能读懂、理解COM组件实例程

序,基本了解客户化组件库扩展的基本思路和方法。

实验内容

1.创建定制的按钮button,实现要素feature的过滤显示;

2.创建定制的工具tool,实现Polygon要素查询;

实验学时

2学时。

实验步骤

内容一:创建feature过滤显示的按钮

通过实现【Command接口来创建定制的按钮(COMcommand)o

ICommand接口包括caption>name、category>bitmap>message

(StatusBarr的提示信息)、tooltip(微帮助)、helpcontextid、helpfile>

enabled以及checked等十个属性和OnCreate、OnClick两个事件。从

Icommand接口的OnCreate事件中获取的ArcMap的Application实例必

须用一个公共变量保存,以便在其它事件中(或者其它接口的事件中甚至

整个工程中)使用。

•OnCreate事件的参数hook传入的是一个Object,也就是ArcMAP的

Application实例,可把它赋给一个lApplication接口的变量,便获得了

ArcMAP的实例。

•在OnClick事件中写入相关代码,表示按下按钮时要实现的功能.

车例要完成的功能是过滤层中要显示的Features,即根据指定的条件显

示层中的Features。

实现本例的功能用到接口IFeatureLayerDefinition中的属性

DefinitionExpression:设置查询条件来选择出要显示的Features0先得

到要过滤层的FeatureLayer,再用IFeatureLayerDefinition的

DefinitionExpression设置显示条件。

在VS.NET2005中使用ArcEngine提供的C#向导建立项目,项目类型

为ClassLibraryo

添加对ArcGIS核心组件的引用。

选中解决方案,单击鼠标右键菜单,添加,新建项。

新建一个BaseCommando

设置Command的类型。

向导自动生成了OnCreate函数,代码如下:

publicoverridevoidOnCreate(objecthook)

(

if(hook==null)

return;

try

(

m_hookHelper=newHookHelperClassO;

m_hookHelper.Hook=hook;

if(m_hookHelper.ActiveView==null)

m__hookHelper=null;

}

catch

{

m_hookHelper=null;

)

if(m_hookHelper=null)

base.m_enabled=false;

else

base.m_enabled=true;

//TODO:Addotherinitializationcode

}

通过m_hookHelper可以得至(JActiveView、FocusMap、PageLayout组件

对象。

修改按钮所在的分类,参考代码如下:

base.m_category="C#Samples*;//localizabletext

base.m_caption="Filter";//localizabletext

base.m_message="Thisshouldworkin

ArcMap/MapControl/PageLayoutControl7";//localizabletext

base.m_toolTip="Filter";//localizabletext

base.m_name="MySample_FilterCommand";//uniqueid,non-localizable

(e.g."MyCategory_MyCommand")

使用ArcGIS开发工具LibraryLocator来查找接口、组件类所在的组件

包名称

在类定义文件头使用using组件包的命名空间。

修改Onclick事件相应函数代码,参考代码如下:

publicoverridevoidOnClick()

(

//TODO:AddCommand1.OnClickimplementation

ILayerlyr=m_hookHelper.FocusMap.get_Layer(O);

IFeatureLayerDefinitionfLyrDef=lyrasIFeatureLayerDefinition;

fLyrDef.DefinitionExpression="人口>=50”;

m_hookHelper.ActiveView.Refresh();

)

开发好一个客户化组件后,便可根据实际需要,在ArcMap环境下加载

这个客户化组件。其一般步骤如下:

1>在Customize对话框“Toolbars"或者"Commands”页,然后点击<Add

FromFile>

2、如果加载是“Commands”,可以将其拖置于任何工具条上

3、如果加载是“ToolBars”,则可在ArcMap中显示

打开ArcMap客户化Customize对话框,添加按钮到ArcMap工具条上。

一回反

[lie工&t丫1«*(ooloiarkxXnsertS«leutaon[oolslindovHelp

口方。昌X电exGC6h295:0O6;]:幺△。:R?陶⑥⑻国目门ED码P际一W回回金

Bditot▼.▼T3:f-31Yyt「3|XOS3:EJ

-gL«yers

-0行陶

匚开福区

匚初近Castoaize巨画

口天心区

ToolbarsQcenwds|Qptio&x|

-

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论