中南大学GIS开发指导书.docx

上传人:无*** 文档编号:68335118 上传时间:2022-12-27 格式:DOCX 页数:85 大小:1.71MB
返回 下载 相关 举报
中南大学GIS开发指导书.docx_第1页
第1页 / 共85页
中南大学GIS开发指导书.docx_第2页
第2页 / 共85页
点击查看更多>>
资源描述

《中南大学GIS开发指导书.docx》由会员分享,可在线阅读,更多相关《中南大学GIS开发指导书.docx(85页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、GIS二次开发实验指导书(ArcGIS 9.3VBA/AO/Engine 开发教程)张宝csuzby中南大学GIS研究中心幣、,宏语言式二次开发(ArcGIS 9.3/VBA)实验创建 VBA 宏与 UIButtonControl实验目的通过ArcMap的VBA环境下编程,初步了解ArcObjects组件库,力 求能读懂、理解VBA实例程序,基本了解宏语言式GIS二次开发的基 本思路和方法。实验内容1 .在ArcMap地图文档中添加一个VBA宏,实现对某图层的唯一 值渲染;2 .在ArcMap地图文档中添加个UlContro!按钮,打开个“虫眼” 窗口。实验学时2学时。实验步骤设置VBA编译环

2、境(显式声明),输入代码Option Explicit内容一:写VBA宏(直接在VBA编辑器中编辑函数和过程)1、创建宏,并启动VBA编辑器2、在地图文档中Project中编写宏(函数或过程)3、在Macro对话框或VBA编辑器中运行VBA宏设置层 UniqueValue Renderer本例要实现的是如何在个层中设置UniqueValue Renderer根据属性 字段填充上不同的颜色的polygon ;首先实例化接口 IGeoFeatureLayer, 通过类 UniqueValueRenderer 实现 lUniqueValueRender 接口的对象实例, 通过对!UniqueValu

3、eRender的属性进行赋值,最后赋值给 IGeoFeatureLayer.Render 属性参考代码如下:Dim pMxDocument As IMxDocumentDim pMap As IMap Dim ILyrCnt As Long Dim ILyr As Long Dim pLyr As ILayer Dim pGeoFeatLyr As IGeoFeatureLayer Dim pUniqueValueR As lUniqueValueRenderer Dim pTable As ITable Dim IfieldNumber As LongDim pColorRamp As IR

4、andomColorRampDim pEnumRamp As lEnumColors Dim pNextUniqueColor As IColor Dim pQueryFilter As IQueryFilter Dim pCursor As ICursor Dim pNextRow As IRow Dim pNextRowBuffer As IRowBuffer Dim code Value As String Dim pFillSymbol As IFillSymbolSet pMxDocument = ThisDocumentSet pMap = pMxDocument.FocusMap

5、ILyrCnt = pMap.LayerCountFor ILyr = 0 To ILyrCnt - 1Set pLyr = pMap.Layer(ILyr)If pLyr.Name = xianjie_changsha_9 ThenSet pGeoFeatLyr = pLyrExit ForEnd IfNext ILyrSet pUniqueValueR = New UniqueValueRendererSet pTable = pGeoFeatLyrA field for the shapefileConst strNameField = Name,IfieldNumber = pTabl

6、e.FindField(strNameField)If IfieldNumber = -1 ThenMsgBox Cant find field called & strNameFieldExit SubEnd If, pUniqueValueR.FieldCount = 1,pUniqueValueR.Field(O) = strNameF 沁 Id,Set pColorRamp = New RandomColorRamp,pColorRamp.StartHue = 0,pColorRamp.Min Value = 99,pColorRamp.MinSaturation = 15,pColo

7、rRamp.EndHue = 360,pColorRamp.Max Value = 100,pColorRamp.MaxSaturation = 30 pColorRamp.size = 100,pColorRamp.CreateRamp True,Set pEnumRamp = pColorRamp.Colors Set pNextUniqueColor = Nothing,Set pQueryFilter = New QueryFilter,pQueryFilter.AddField strNameField, Set pCursor = pTable.Search(pQueryFilte

8、r, True),Set pNextRow = pCursor.NextRow, Do While Not pNextRow Is Nothing,Set pNextRowBuffer = pNextRow,code Value = pNextRowBuffer. Value(lfieldNumber),Set pNextUniqueColor = pEnumRamp.Next,If pNextUniqueColor Is Nothing Then,pEnumRamp.Reset,Set pNextUniqueColor = pEnumRamp.Next End If,Set pFillSym

9、bol = New SimpleFillSymbol pFillSymbol.Color = pNextUniqueColor pUniqueValueR. AddValue code Value,pFillSymbol Advance the cursor to the next row, or end of the dataset Set pNextRow = pCursor.NextRow Loop* Now set the layers renderer to the unique value renderer,Set pGeoFeatLyr.Renderer = pUniqueVal

10、ueR,pMxDocument. Active View.Refresh,pMxDocument.UpdateContents运行效果图如下内容二:创建UlControl (交互式VBA编程)1、Customize 对话框的“Commands”页,选中UlControls”后点击小6 UlControl按钮2、选择UlControl类型:UIButtonControl:创建 Button;UIToolControl:创建与 Map 交互的 Tool;UIEditBoxControl:创建 EditBox; UIComboB oxControI :仓建 ComboBox。3、进入VBA编辑器在U

11、lControl的事件中进行VBA编程4、添加一个工具条,选中UlControl并将其拖置到工具条上。CustomizeToolbars:Versi oningVBA SamplMew ToolbarToolbars | Commands | Options |LayoutMap CacheLJNetwork EditingRoute Editing Spatial AdjustmentStandardy Tools TopologyUtility Network Analyst参考代码如下:运用这个子程序生成了 一个新的放大镜窗口,在本例中将放大率设定为200%, Sub CreateMag

12、nifierWindow(),Dim pMaplnset As IMapInset,Dim pMapInsetWindow As IM叩InsetWindow,Dim pDataWindowFactory As IDataWindowFactory, Set pDataWindowFactory = New Map Inset WindowFactory,If pDataWindowFactory.CanCreate(Application) Then,Set pMapInsetWindow = pDataWindowFactory.Create(Application),Set pMapln

13、set = pMaplnsetWindow.MapInset,Set the zoom percent to 200%,pMapInset.ZoomPercent = 200,pMapInsetWindow.Show TrueEnd If, End Sub运行效果图如下 50077T产i頂 me。ArcMap JUcInTo 0qa ta+ |tX032,M6:幺。 e 。七y* I-3 a m m Si shaiv point Aport .D 4e port HE .O hpcr* owzport rfc* H f Q dsxsc D 4(1C Iyd*c. odtpotrgon 依 Mr

14、gan, y polygon SB iiporoanMagnlhcMion 700% LMl96.4r5021 6rm 8NTN实验要求1 .使用基础实习成果数据(或其他示例数据)2 .完成实验要求的两个实例(最好要有自己的内容)3 .将代码保存在个地图文件MXD中,上交后方可离开实验室(如 未完成可在课下通过邮件提交)实验二创建 VBA UIToolControl实验目的通过ArcMap的VBA环境下编程,初步了解ArcObjects组件库,实 现GIS的基本窗口操作,了解宏语言式GIS二次开发的基本思路和方法。实验内容1 .在ArcMap地图文档中添加个UlControl工具,实现对地图的

15、拉 框和点击放大;2 .在ArcMap地图文档中添加个UlControl工具,实现对地图的鼠 标移动。实验学时2学时。实验步骤设置VBA编译环境(显式声明),输入代码Option Explicit内容一:窗口放大用户点击按钮后,可以在地图上进行点击或者拖放矩形框来放大地图 因为考虑到用户可以单击放大,也可以拖放矩形框来放大,所以采用 INewEnvelopeFeedback接口来显示拖放矩形框效果。INewEnvelope-Feedback oINewEnvelope-Feedback2 ODisplay-Feedback个New-Envelope-FeedbackThe new envelo

16、pe feedback is perhaps the most useful and simplest of the feedbacks. It is used to allow theuser to create a newenvelope on the display, known as “dragging a rectangle*9.日 INewEnvelopeFeedback: IDisplayFeedbackAsp ectRatio DoubleM Constraint esriEnvelopeConstraiiitsStart (in Point: IPoirit)V- Stop:

17、 Envelope日 IDisplayFeedback: IUnknown Display: IScreenDisplaySymbol: ISyinbolv- MoveTo (in Point: IPoint)+ Refresh (in hDC: OLE_HANDLE)日 IUnknown hidden AddRefQueryinterface (in riid: GUID, out ppvObj: Any) Release接口 INewEnvelopeFeedback 有 IDisplayFeedback 派生。接口 !DisplayFeedback具有如属性和方法:Display:设置Fe

18、edback所利用的显示属性;MoveTo:当鼠标移动时,设置鼠标点所在的坐标;Refresh:刷新画面;Symbol:设置显示风格。Feedbacks对象可以划分为两类:1 .大部分是通过stop方法返回个新的儿何2 .也有一些纯粹为了显示,开发者来计算个新的几何,包括 MoveGeometryFeedback, MovelmageFeedback, NewMultiPointFeedback, VertexFeedbackoICf O- rr1?Display feedback objectsCraatM aonWOlay tor makrh9apoH ana Butar C6.Bezir

19、Mov-Point-FeedbackZnataa a fwdba tf fAMtMCk OGCtBGroup-FeedbackCnatM a taatack 9n Vw flay 7 mraddpa neweteto : PNwCirde*FeedbackT1* , TTNeOWUEFMbUll o-l NeW hDimanion- cmts aco tr, I Feedback 11tor aag MW dlnangi ftapi / | | fLNMaraMFaaduct oravtif a gaoTMUy by rate rare*FedfcckCtmim a fMdbanOmim ar

20、wdl tormosyhgCiwtM t iMteck on M dap fey fv*g a rww arwtfcpeEnvelope-:一I (Im 卜CfMtM a iaa* on th* dipfe tar movtaga ”Craa a laaftadt on *ng verttaM of a 9carwtiyMoveLhe-FeedbeckzznMovPoint-F0dbacklMlglMaop(rMbac ICraalM fM&ac k cn 2 dfepay tor mo*9 a 网gonVlex-Feedback图1显示反馈Feedbacks对象具体步骤如下:添加 UIToo

21、lControl添加模块级变量,参考代码如下:Dim m_bIsMouseDown As BooleanDim m_pPoint As IPointDim m_pFeedbackEnv As INewEnvelopeFeedback修改蔵标键按下事件,licrosoft Visual Basic - Chancsha. axd - ThisDocuBent (代助文件0)編吟6 種的叩 蠶入(X)格式 0试Q)。行 工具9 外援程序 (1)分勛QP豹?ET */ S 一行 T9.列 1M(!“)题 Frjct1*Ardl 対象 司 ThiiD*cwa ;今積煥 的 避 曲引用参考代码如下:En

22、d SubTb,k1cw *xDcwaat 険字母序I按分类用IPrivate Dim Dim DimpFillSymbol.Color n pNexp pUniqueValueR. AddValue c統 Advance the cursor toSet pNextRow = pCursor.5 .hl頂Now set the layers renderefc“mSet pGeoFeatLyr. Renderer = pUniqueValueR pMxDocument. ActiveView. Refresh pMxDocument. UpdateContentsEnd SubPrivate

23、 Sub ZoomOut_Select 0Sub ZoomW i ndow_C1i ck() pMapInset As IMapInset pMapInsetWindow As IMapInsetWindow pDat aW i ndowFac t ory As IDa t aWi ndowFac t ory pDataWindowFactory = New MapinsetWindowFactoryIf pDataWindowFactory. CanCreate(Application) ThenSet pMapInsetWindow = pDataWindowFactory. Create

24、(ApplicatSet pMapInset = pMapInsetWindow. Mapinset * Set the zoom percent to 200%Private Sub ZoomOut_MouseDown(ByVal button As Long. By Vai shift As Long, ByVai x As Long, ByVai y As Long) Dim pActiveView As lActiveView Dim pMxDocument As IMxDocument ,鼠标左键按下 If button 1 Then Exit Sub , If pActiveVie

25、w Is Nothing Then ,Set pMxDocument = ThisDocument,Set pActiveView = pMxDocument. Activated ViewEnd If得到起始点,Set m_pPoint = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y)m_bIsMouseDown = True Exit SubEnd Sub修改鼠标移动事件响应函数,参考代码如下:Private Sub ZoomOut_MouseMove( By Vai button As Long, ByV

26、ai shift As Long, ByVai x As Long, ByVai y As Long) Dim pMxDocument As IMxDocument Dim pActiveView As IActiveView,,鼠标移动:主要通过InewEnvelopeFeedback.StartPoint和MoveTo方法来绘制矩形框,然后赋值给IActiveView.Extcnd属性,达到地图的放大缩小, If Not m_bIsMouseDown Then Exit Sub,If pActiveView Is Nothing Then Set pMxDocument = ThisDoc

27、ument Set pActiveView = pMxDocument.ActivatedView End IfIf m_pFeedbackEnv Is Nothing Then,Set m_pFcedbackEnv = New NewEnvelopeFeedback,Set m_pFeedbackEnv.Display = pActiveView.ScreenDisplay m_pFeedbackEnvStart m_pPoint End If,Set m_pPoint = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(

28、x, y) Draw Envelope,m_pFeedbackEnv.MoveTo m_pPoint Exit SubEnd Sub修改鼠标键弹起事件响应函数,参考代码如下:Private Sub ZoomOut_MouseUp( By Vai button As Long, ByVai shift As Long, ByVai x As Long, ByVai y As Long)Dim pActiveView As lActiveViewDim pMxDocument As IMxDocumcntDim pEnv As Envelope,鼠标左键弹起,If button 1 Then Ex

29、it Sub,If pActiveView Is Nothing Then,Set pMxDocument = ThisDocument,Set pActiveView = pMxDocument.ActivatedViewEnd IfIf (m_pFeedbackEnv Is Nothing) Then,User Only Click Map with left button,Set pEnv = pActiveView.Extent如果是缩小的话,将这里的两个0.5都改成1.5,pEnv.Expand 03,0.5, TrueElse,User Draw a Envelope,Set pE

30、nv = m_pFeedbackEnv.StopEnd If,pActiveView.Extent = pEnvm_bIsMouseDown = False,Set m_pPoint = Nothing,Set m_pFeedbackEnv = Nothing,pActiveView.Refresh,Exit SubEnd Sub内容二:窗口移动用户点击按钮后,可以拖动地图显示采用 lActiveView.ScreenDisplay.PanStart 和 Pan Stop 方法使地图移动。通过 lActiveView.ScreenDisplay 的 PanStart 和 PanStop 方法在

31、 !Too! 的MouseDown,MouseUp和MouseMove事件的响应实现移动效果添加模块级变量,参考代码如下:Dim m_bIsMouseDown As Boolean修改蔵标键按下事件响应函数,参考代码如下:Private Sub Pan_MouseDown(ByVal button As Long, By Vai shift As Long, By Vai x As Long. ByVai y As Long) Dim pMxApp As IMxApplication Dim pScrDisp As IScreenDisplayDim pStartPoint As IPoint

32、,鼠标左键按下 If Not button = 1 Then Exit SubSet pMxApp = Application,Set pScrDisp = pMxApp.Display.FocusScreen,m.blsMouseDown = True,Set pStartPoint = pScrDisp.DisplayrD,ansformation.ToMapPoint(x, y)得到起始点,开始移动pScrDisp.PanStart pStartPointExit SubEnd Sub修改鼠标移动事件响应函数,参考代码如下:Private Sub Pan_MouseMove( By Va

33、i button As Long, ByVai shift As Long, ByVai x As Long, ByVai y As Long) Dim pMxApp As IMxApplication Dim pScrDisp As IScreenDisplayDim pMoveToPoint As IPoint鼠标移动, If Not m_bIsMouseDown Then Exit Sub,Set pMxApp = ApplicationSet pScrDisp = pM x App. Di splay.FocusScreen,Set pMoveToPoint = pScrDisp.Di

34、splayTransformation.ToMapPoint(x, y) 根据鼠标移动,移动地图 pScrDisp.PanMoveTo pMoveToPoint Exit SubEnd Sub修改鼠标键弹起事件响应函数,参考代码如下:Private Sub Pan_MouseUp( By Vai button As Long, ByVai shift As Long, ByVai x As Long, ByVai y As Long) Dim pMxApp As IMxApplication Dim pScrDisp As IScreenDisplay鼠标左键弹起, If Not m_bIsM

35、ouseDown Then Exit Sub,Set pMxApp = Application,Set pScrDisp = pMxApp.Display.FocusScreen,m_bIsMouseDown = False,pScrDisp.PanStopExit SubEnd Sub实验要求1 .使用基础实习成果数据(或其他示例数据)2 .完成实验要求的两个实例(最好要有自己的内容)3 .将代码保存在个地图文件MXD中,上交后方可离开实验室(如 未完成可在课下通过邮件提交)第二篇客户化组件库扩展CArcGIS 9.3/C#)实验三AO组件库扩展由于Arcinfo是完全COM化的,对于需要对

36、Arcinfo进行结构定制和功 能扩展的高级开发人员来说,这非常具有吸引力。任何与COM兼容的编 程语言,如:C#,Visual C+,Delphi或VisuaIJ+都能用来定制和扩展 Arcinfo 个扩展模块开发的基本步骤如下:(1)新建工程,添加A0的引用;(2)实现需要的接口,添加具体的代码;(3)编译为 DLL,注册该 COM 组件,并在 ArcGIS 的 omponent categories 注册(也可以使用界面的自定义对话框浏览定位到具体的刖来注册);(4)测试和调试。编写ArcGIS扩展,可以完成以下任务: Command:即个按钮、菜单,通过实现ICommand ITool

37、 IToolCommand 接口来创建; Edit Task:与ArcMap Editor协同工作的组件,需要实现lEditTask 接口; Table of Contents tab:类似左侧的数据和图层视图的小窗口,通过实 现!ContentsView接口来创建; Class extension:自定义对象(feature),即有自己属性和规则的空间 对象,例如红绿灯对象,电线,电闸等等,需要实现IClassExtension等 接口。实验目的脱离ArcM叩环境而在、BNC或C#开发环境中进行外部独立的开 发,初步了解ArcObjects组件库,求能读懂、理解COM组件实例程 序,基本了解

38、客户化组件库扩展的基本思路和方法。实验内容1 .创建定制的按钮button实现要素feature的过滤显示;2 .创建定制的工具tool,实现Polygon要素查询;实验学时2学时。实验步骤内容一:创建feature过滤显示的按钮通过实现ICommand接口来创建定制的按钮(COM command)ICommand 接口包括 caption name category bitmap message (StatusBarr 的提示信息)、tooltip (微帮助)、help context id、help Ele、 enabled以及checked等十个属性和OnCreate、OnClick两个

39、事件。从 Icommand接口的OnCreate事件中获取的ArcMap的Application实例必 须用个公共变量保存,以便在其它事件中(或者其它接口的事件中甚至 整个工程中)使用。OnCreate事件的参数hook传入的是个Object,也就是ArcMAP的 Application实例,可把它赋给个lApplication接口的变量,便获得了 ArcMAP的实例。在OnClick事件中写入相关代码,表示按下按钮时要实现的功能.本例要完成的功能是过滤层中要显示的Features,即根据指定的条件显 示层中的Features 实现本例的功能用到接口 IFeatureLayerDefiniti

40、on中的属性 DefinitionExpression :设置查询条件来选择出要显示的Features先得 到要过滤层的 FeatureLayer,再用 IFeatureLayerDefinition 的 DefinitionExpression 设置显示条件。在VS.NET 2005中使用ArcEngine提供的C#向导建立项目,项目类型 为 Class Library ,起帕页licrosoft Visual Studio文件包)漏磕 视图工具隻)會口世)社区 藉助电)添加对ArcGIS核心组件的引用。选中解决方案,单击鼠标右键菜单,添加,新建项。新建一个 Base Commando设置C

41、ommand的类型。ArcGIS levYizard OptionsWhat kind of command do you want to create?ArcMap, MapControl or PageLayoutControl CommandArcGIobe or GlobeControl CommandArcScene or SceneControl CommandBlank CommandDesktop ArcCatalog CommandDesktop ArcGIobe CommandDesktop ArcMap CommandDesktop ArcScene CommandMap

42、Control or PageLayoutControl CommandUniversal CommandAdditional InformationA command for 2D display registered in the ControlsCommands and MxCommand component categories.OKCancel向导自动生成了 OnCreate函数,代码如下:public override void OnCreate(object hook)(if (hook = null) return;try (m_hookHelper = new HookHelperClassO;m_hookHelper. Hook = hook;if (m_hookHelper. ActiveView = null) m_hookHelper = null;) catch ( m_hookHelper = null;)if (m_hookHelper = null)base. m_enabled = false;elsebase. m_enabled = true;/ TODO: Add other initialization code 通过 m_hookHeIper 可以得至 ActiveView、FocusMa

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com