GIS程序设计实验教程(ArcEngine二次开发)

GIS程序设计实验教程(ArcEngine二次开发)

2023年7月1日发(作者:)

GIS程序设计实验教程(ArcEngine⼆次开发)⽬录1 实验⼀:AOI书签开发... 11.1 实验⽬的... 11.2 实验内容... 11.3 实验步骤与结果... 11.3.1 功能流程图... 11.3.2 所⽤接⼝的作⽤... 21.3.3 具体实现过程... 32 实验⼆:地图数据组织与访问... 72.1 实验⽬的... 72.2 实验内容... 72.3 实验步骤与结果... 72.3.1 功能流程图... 72.3.2 所⽤接⼝的作⽤... 72.3.3 具体实现过程... 83 实验三:地图渲染... 133.1 实验⽬的... 133.2 实验内容... 133.3 实验步骤结果... 133.3.1 功能流程图... 133.3.2 所⽤接⼝的作⽤... 143.3.3 具体实现过程... 144 实验四:空间数据处理... 214.1 实验⽬的... 214.2 实验内容... 214.3 实验步骤与结果... 224.3.1 功能流程图... 224.3.2 所⽤接⼝的作⽤... 224.3.3 创建Shapefile. 234.3.4 添加点要素... 285 实验五:GIS分析... 325.1 实验⽬的... 325.2 实验内容... 325.3 实验步骤与结果... 335.3.1 功能流程图... 335.3.2 所⽤接⼝的作⽤... 335.3.3 空间查询... 355.3.4 缓冲区分析... 395.3.5 数据统计... 426 实验六:栅格数据处理... 446.1 实验⽬的... 446.2 实验内容... 446.3 实验步骤与结果... 456.3.1 功能流程图... 456.3.2 所⽤接⼝的作⽤... 456.3.3 创建栅格数据集... 476.3.4 栅格数据格式转换... 516.3.5 栅格影像镶嵌... 546.3.6 栅格统计... 587 实验总结... 61

书签开发² 掌握AOI书签程序开发² 实现AOI书签的创建² 实现AOI书签的调⽤1) IAOIBookmark接⼝Ø 简介提供访问控制AOI书签的成员的权限。Ø MembersNameLocationNameZoomToDescription书签的位置书签的名称放⼤到书签2) IMapBookmarks接⼝Ø 简介提供对控制地图书签的成员的访问权限。Ø MembersNameAddBookmarkBookmarksDescription为集合添加书签书签

3) IEnumSpatialBookmark接⼝Ø 简介提供对控制空间书签列表的成员的访问权限。Ø MembersNameNextResetDescription返回下⼀个空间书签重置枚举器4) ISpatialBookmark接⼝Ø 简介提供对控制空间书签的成员的访问权限。Ø MembersNameZoomToDescription放⼤到书签1) 添加控件在程序的主窗体上的菜单栏上添加⼀个菜单项(MenuItem),Text属性为“AOI书签”,再在其下创建⼀个⼦菜单项(MenuItem),Text属性为 “创建书签”,其控件名为“miCreateBookmark”,并添加⼀个组合框(ComboBox),其控件名为“cbBookmarkList”,⽤于保存已创建的书签名。图 1 添加书签控件2) 添加类库引⽤using ry;右键单击“引⽤”图 2 添加引⽤3) 添加“创建书签”函数添加成员函数CreateBookmark,以创建书签图 3 CreateBookmark函数4) 添加“书签名称设置”窗体图 4 书签名称设置在当前窗体代码中,添加⼀个主窗体类型的成员变量m_frmMain,并新建⼀个以主窗体类型对象为参数的构造函数,⽤于调⽤主窗体的相关成员。最后“确认”按钮“Click”事件响应函数输⼊代码,实现书签名称的传递。图 5 设置书签窗体5) 实现创建书签与调⽤书签功能为主窗体的“创建书签”菜单项⽣成“Click”事件响应函数,并添加代码运⾏“书签名称设置”窗体。图 6 创建书签事件为组合框cb_BookmarkList⽣成“选择索引更改”(SeletedIndexChanged)事件响应函数图 7 书签索引事件

6) 运⾏结果运⾏程序,在地图的不同范围内创建书签后,尝试更改组合框的选中项,可发现地图依据所选中的书签改变显⽰范围。图 8 创建书签图 9 运⾏结果

² 了解ArcGIS Engine中地图数据的组织结构² 掌握ArcGIS Engine地图数据访问⽅法² 编写“数据操作”类² 利⽤DataGridView控件展⽰Continents图层的序号和名称字段1) ILayer接⼝Ø 简介提供对使⽤所有图层的成员的访问权限。Ø MembersNameNameDescription图层名称2) IFeatureLayer接⼝Ø 简介提供对控制要素图层常见⽅⾯的成员的访问权限。Ø MembersNameSearchDescription根据搜索条件创建⼀个游标3) IFeatureCursor接⼝Ø 简介提供对取出枚举要素、字段集合并允许更新、删除和插⼊要素的成员的访问。Ø MembersNameNextFeatureDescription将光标的位置前进⼀个,然后在该位置返回Feature对象1) 添加控件在程序的主窗体“空间数据”菜单项的下拉菜单中,添加⼀个菜单项,“⽂本”的属性为“访问图层数据”,控件名为“miAccessData”,⽤于稍后调⽤“数据展⽰台”窗体图 10 数据访问菜单2) 添加“数据展⽰台”窗体在当前项⽬中增加⼀个新的窗⼝类,命名为“”,并在该窗体中添加两个控件:⼀个⽂本框,⽤于显⽰当前显⽰数据的名称,其控件名为“tbDataName”;⼀个数据⽹格视图(DataGridView),“只读”(ReadOnly)属性为True,其控件名为“dataGridView1”。图 11 数据展⽰台窗体在当前窗体代码中,新建构造函数,⽤于设置展⽰的数据表名称和数据源。图 12 构造函数3) 添加“数据操作”类在该项⽬中添加⼀个类,并命名为“”,该类⽤于管理当前项⽬中涉及数据操作的相关功能。向该类中添加相应的类库引⽤,并新建⼀个IMap接⼝对象为参数的构造函数,将当前的地图对象传⼊类内,以添加创建好的Shap⽂件和要素。图 13 类库引⽤图 14 传⼊当前地图对象4) 添加“获取地图图层”功能函数向DataOperator类添加成员函数,添加成员函数GetLayerByName,通过指定的图层名获取对应图层对象。图 15 添加GetLayerByName成员函数添加成员函数GetContinentsNames,获取地图中“Continents”图层,读取每个州的名称,并以DataTable类型返回。图 16 添加GetContinentsNames成员函数图 17 添加GetContinentsNames成员函数5) 实现创建地理数据列表功能为主窗体的“访问图层数据”菜单项⽣成“Click”事件响应函数,并添加代码运⾏“数据展⽰台”窗体,以展⽰各个州的名称。图 18 访问图层数据6) 运⾏结果运⾏程序,点击“访问图层数据”菜单项后,程序弹出载有各个州名称的数据表窗体,该表名称为“各⼤洲州名”。图 19 运⾏结果

3.1

² 了解地图符号的分类与可视化过程² 掌握地图符号的渲染⽅法3.2

² 编写“地图编制”类,添加成员函数² 实现获取地图渲染器信息功能² 实现地图的简单符号渲染3.3

1) IGeoFeatureLayer接⼝Ø 简介提供对控制要素图层地理⽅⾯的成员的访问权限。Ø MembersNameRendererDescription⽤于绘制图层的渲染器2) ISymbol接⼝Ø 简介提供对控制符号的成员的访问权限。3) ISimpleRenderer接⼝Ø 简介提供对成员的访问,这些成员控制为每个要素绘制相同符号的渲染器。Ø MembersNameSymbolDescription⽤于绘制每个要素的符号1) 添加控件在程序的主窗体上端菜单栏添加⼀个菜单项“地图表现”,其控件名为“miCarto”。向该菜单项的下拉菜单中,添加两个菜单项,“⽂本”属性分别设置为“简单渲染图层”和“获取渲染器信息”,其控件名分别为“miRenderSimply”和“miGetRendererInfo”。图 20 添加控件2) 添加“地图编制”类向当前项⽬添加⼀个新的类,将类⽂件命名为“”。该类⽤于管理当前项⽬中涉及地图整饰、修改和展⽰的相关功能,并引⽤相应类库。图 21 引⽤类库3) 完善“地图编制”类的功能向MapComposer类添加成员函数GetRendererType,⽤于获取指定图层的渲染器类型信息。图 22 添加GetRendererType成员函数图 23 添加GetSymbolFromLayer成员函数图 24 添加RenderSimply成员函数

图 25 添加RenderSimply成员函数图 26 添加RenderSimply成员函数

4) 实现图层简单渲染为主窗体的“简单渲染图层”菜单项⽣成“Click”事件响应函数,并添加代码实现对“WorldCities”图层的简单渲染。图 27 简单渲染图层为主窗体的“获取渲染器信息”菜单项⽣成“Click”事件响应函数,并添加代码实现对“WorldCities”图层的简单渲染。图 28 简单渲染图层

5) 运⾏结果运⾏程序,点击“获取渲染器信息”菜单项后,程序提⽰“World Cities”图层的渲染器类型信息;点击“简单渲染图层”菜单项,“World Cities”图层被简单渲染,符号为红⾊点状标记。图 29 简单渲染图层在简单渲染“WorldCities”图层前后,分别点击“获取渲染器信息”菜单项,可发现该图层的渲染器类型已被改变。

图 30 渲染前后渲染器信息对⽐² 了解创建空间数据的过程² 掌握创建空间数据的⽅法² 实现创建Shapefile⽂件的程序² 实现新增点要素程序1) IWorkspaceFactory接⼝Ø 简介提供对创建和打开⼯作空间并提供⼯作空间⼯⼚信息的成员的访问权限。Ø MembersNameCreateOpenOpenFromFileDescription创建由⽬录,⽂件名和连接属性指定的新⼯作空间打开由连接属性指定的⼯作区打开给定⽂件名称指定的⼯作区2) IFeatureWorkspace接⼝Ø 简介提供对创建和打开各种类型的数据集和其他⼯作空间级别对象的成员的访问权限。3) IFieldEdit接⼝Ø 简介提供对编辑字段属性的成员的访问权限。

Ø MembersNameAliasName_2Name_2Type_2Description设置字段的别名设置字段的名称设置字段的类型4) ISpatialReference接⼝Ø 简介提供对控制SpatialReference的成员的访问权限。5) IPoint接⼝Ø 简介提供对定义⼆维点的成员的访问权限。Ø MembersNamePutCoordsDescription设置X和Y坐标1) 添加控件和类库引⽤在程序的主窗体上端菜单栏添加⼀个菜单项“数据操作”,其控件名为“miData”。向该菜单项的下拉菜单中添加菜单项,“⽂本”属性设置为“创建Shapefile”,其控件名为“miCreateShapefile”。图 31 数据操作2) 添加“创建Shape⽂件”功能函数创建完DataOperator类后,可进⼀步添加成员函数,已完善类的功能。添加成员函数CreateShapefile,通过指定的上级路径、⽂件夹名和⽂件名,创建⼀个新的Shape⽂件。图 32 添加CreateShapefile成员函数图 33 添加CreateShapefile成员函数图 34 添加CreateShapefile成员函数

添加成员函数AddFeatureClassToMap,将指定的要素类以图层的形式添加到类保存的地图对象中,并同时指定图层的名称。图 35 添加AddFeatureClassToMap成员函数3) 实现创建Shape⽂件在主窗体视图设计视图中,为“创建Shapefile”菜单项⽣成“Click”事件响应函数,并添加代码调⽤DataOperator类中的相关⽅法,创建Shape⽂件,并使其以图层形式添加到地图中。图 36 创建Shape⽂件 图 37 创建Shape⽂件4) 运⾏结果运⾏程序,点击“创建Shapefile”菜单项后,新建图层“ObservationStations”被显⽰在地图上。勾选“添加要素”菜单项,在地图上按下⿏标,即可在“Observation Stations”图层上添加要素。图 38 创建Shapefile

1) 添加控件和类库引⽤在程序的主窗体上端的菜单栏“数据操作”的下拉菜单中,添加⼀个菜单项“添加要素”,其控件名为“miAddFeature”,菜单项的“可⽤”(Enabled)属性为false。图 39 添加要素控件2) 添加“新增要素”函数在“”类中添加成员函数AddFeatureToLayer,在⿏标点击处,在给定名称的图层上新增要素,并指定要素的名称。图 40 添加AddFeatureToLayer成员函数

图 41 添加AddFeatureToLayer成员函数3) 实现添加要素功能为“添加要素”菜单项⽣成“Click”事件响应函数,以设置按钮是否被勾选。在勾选的情况下,在地图上按下⿏标才会在新建图层上添加要素。图 42 添加要素响应事件

为地图控件对象添加“OnMouseDown”事件响应函数,并添加代码调⽤DataOperator类中的相关⽅法,在地图⿏标按下处创建要素、添加⾄新建图层,并显⽰在地图上。图 43 添加OnMouseDown事件响应函数

4) 运⾏结果运⾏程序,勾选“添加要素”菜单项,在地图上按下⿏标,即可在新建图层“ObservationStations”图层上添加要素。图 44 添加要素运⾏结果

分析² 了解GIS空间分析的内容² 掌握空间关系查询⽅法² 掌握空间拓扑分析⽅法² 掌握空间数据统计⽅法² 实现空间关系查询程序² 实现缓冲区分析程序² 实现要素统计程序1) IQueryFilter接⼝Ø 简介提供对基于属性值和/或关系过滤数据的成员的访问权限。Ø MembersNameWhereClauseDescription过滤器的where⼦句(设置过滤条件)2) IFeature接⼝Ø 简介提供对返回并设置功能属性的成员的访问权限。Ø MembersNameShapeDescription对该功能的默认形状的引⽤(获取要素⼏何)3) ISpatialFilter接⼝Ø 简介提供对返回和修改过滤器将使⽤的空间关系类型的成员的访问权限。Ø MembersNameGeometryWhereClauseSpatialRelDescription⽤于过滤结果的查询⼏何过滤器的where⼦句过滤器检查空间关系4) IFeatureSelection接⼝Ø 简介提供对控制功能选择的成员的访问权限。Ø MembersNameSelectFeaturesDescription根据指定的条件和组合⽅法选择要素5) ITopologicalOperator接⼝Ø 简介根据现有⼏何图形之间的拓扑关系,提供对构件进⾏构造以创建新⼏何图形的权限。Ø MembersNameBufferDescription构造⼀个多边形,该多边形是⼩于或等于距该⼏何体的指定距离处的点的轨迹6) IDataStatistics接⼝Ø 简介提供对成员的访问权限以⽣成字段的统计信息。Ø MembersNameCursorStatisticsDescription将⽣成统计信息的游标当前游标上当前字段的统计信息7) IStatisticsResults接⼝Ø 简介提供对⽤于报告统计的成员的访问权限。Ø MembersNameMaximumMeanMinimumDescription最⼤值算术平均值最⼩值1) 添加控件和类库引⽤在程序的主窗体上端的菜单栏“GIS分析”的下拉菜单中,添加⼀个菜单项“空间查询”,其控件名为“miSpatilFilter”。图 45 添加类库引⽤图 46 添加“空间查询”菜单项2) 添加地图分析类在项⽬中添加MapAnalysis,向当前项⽬中添加了⼀个新的类,将类⽂件命名为“”。该类⽤于管理当前项⽬中涉及的地图分析相关功能,并在该类中添加成员函数QueryIntersect,根据给定图层进⾏空间交叉查询。图 47 地图分析类图 48 添加成员函数QueryIntersect图 49 添加成员函数QueryIntersect

3) 添加空间查询事件为菜单项“空间查询”菜单项⽣成“Click”事件响应函数,实现要素的空间交叉选择,并在地图上明显标识。图 50 空间查询事件响应函数

4) 运⾏结果运⾏程序,点击“空间查询”菜单图 51 查询成功提⽰框图 52 查询结果

1) 添加菜单项在程序的主窗体上端的菜单栏“GIS分析”的下拉菜单中,添加⼀个菜单项“缓冲区分析”,其控件名为“miBuffer”。图 53 添加“缓冲区分析”菜单项2) 添加“缓冲区分析”函数向地图分析类MapAnalysis中添加缓冲区分析函数图 54 添加Buffer成员函数图 55 添加Buffer成员函数3) 添加缓冲区分析事件为“缓冲区分析”菜单项⽣成“Click”事件响应函数,实现要素的缓冲区分析,并通过空间交叉选择城市并在地图上明显标识。图 56 缓冲区分析事件响应函数

4) 运⾏结果运⾏程序,点击“缓冲区分析”菜单项,即可在地图上显⽰满⾜条件的城市图 57 分析成功提⽰框图 58 分析结果

1) 添加菜单项在程序的主窗体上端的菜单栏“GIS分析”的下拉菜单中,添加⼀个菜单项“要素统计”,其控件名为“miStatistic”。图 59 添加“要素统计”菜单项2) 添加“要素统计”函数向地图分析类MapAnalysis中添加要素统计函数图 60 添加Statistic成员函数3) 添加要素统计事件为菜单项“要素统计”菜单项⽣成“Click”事件响应函数,实现要素的⾯积统计分析,并将统计结果以对话框形式输出。图 61 添加“要素统计”事件响应函数4) 运⾏结果运⾏程序,点击“要素统计”菜单项,即可显⽰世界各⼤洲⾯积统计信息的消息框图 62 统计结果

6.1

² 了解栅格数据的结构² 掌握创建栅格数据集的⽅法² 掌握栅格数据格式转换与镶嵌的⽅法² 掌握栅格数据的统计⽅法² 实现创建栅格数据集程序² 实现栅格数据格式转换程序² 实现栅格数据镶嵌程序² 实现栅格数据统计程序1) IRasterWorkspace接⼝Ø 简介提供对控制栅格⼯作空间的成员的访问权限。Ø MembersNameOpenRasterDatasetDescription根据名称在⼯作空间中打开⼀个栅格数据集2) IRasterWorkspaceEx接⼝Ø 简介提供对创建和打开栅格⽬录和数据集的成员的访问权限。Ø MembersNameOpenRasterCatalogCreateRasterDatasetDescription打开现有的栅格⽬录创建⼀个新的栅格数据集3) IRasterBandCollection接⼝Ø 简介提供对控制栅格波段集合的成员的访问。Ø MembersNameSaveAsDescription⽤集合中的波段创建⼀个新的栅格数据集4) IMosaicRaster接⼝Ø 简介提供对控制栅格镶嵌的成员的访问权限。Ø MembersNameRasterCatalogMosaicColormapModeMosaicOperatorTypeDescription镶嵌栅格⽬录中的所有影像的输出栅格⽬录当前镶嵌伪彩栅格数据集的模式当前镶嵌运算符类型5) IEnumRasterBand接⼝Ø 简介提供对控制栅格波段枚举器对象的成员的访问权限。Ø MembersNameNextDescription在枚举序列中检索下⼀个栅格波段6) IRasterBand接⼝Ø 简介提供对控制栅格波段对象的成员的访问权限。Ø MembersNameStatisticsHasStatisticsComputeStatsAndHistHistogramDescription当前栅格波段的统计信息指⽰该波段是否有统计数据如果以前未存储,则计算统计量和直⽅图当前栅格波段的直⽅图1) 添加控件和类库引⽤在程序主菜单上添加⼀个菜单项“栅格管理”,在下拉菜单中添加“创建栅格数据集”,其控件名为“miCreateRaster”。图 63 添加类库引⽤图 64 添加“创建栅格数据集”菜单项2) 添加栅格⼯具类通过解决⽅案资源管理器,点击“项⽬”菜单下的“添加类”按钮,添加栅格⼯具类RasterUtil,该类⽤于管理当前项⽬中涉及的栅格数据操作的相关功能。类添加后,当前视图⾃动转⾄RasterUtil类的代码页。图 65 添加“”类3) 添加“创建栅格数据集”函数在Geodatabase中创建的栅格数据集是没有维数的,只是数据集的某些属性信息的占位符,如波段数、像素值、栅格列属性、⼏何列属性。⼀旦空的栅格数据集创建成功,栅格的像素值可以从别的数据集中通过拼接(mosaic)添加进去。图 66 在ArcMap中创建⽂件地理数据库图 67 打开栅格⼯作空间图 68 添加“CreateRaster”成员函数4) 添加“栅格数据集名称”窗体在当前项⽬中添加“”窗体,⽤于设置栅格数据集的名称,并在“确认”按钮中添加“Click”事件图 69 设置栅格数据集名称窗体图 70 添加创建栅格数据集事件5) 运⾏结果点击“创建栅格数据集”,弹出设置栅格数据集名称,输⼊“raster”后,点击“确认”按钮,并弹出“创建成功”对话框图 71 输⼊栅格数据集名称图 72 “创建成功”对话框

然后在ArcCatalog中查看已创建的栅格数据集图 73 创建好的栅格数据集1) 添加控件在程序的主菜单项“栅格管理”下增加菜单项“格式转换”,控件名为“miRasterConvert”图 74 添加“格式转换”菜单项2) 添加“栅格数据格式转换”函数向栅格⼯具类RasterUtil添加“栅格数据格式转换”函数,根据输⼊栅格集及各类参数转换成输出栅格数据集。

图 75 添加“RasterUtil”成员函数3) 添加栅格数据转换窗体在当前项⽬中添加“”的窗体图 76 栅格数据转换窗体图 77 栅格数据转换事件响应函数4) 运⾏结果点击“格式转换”按钮,在“栅格数据格式转换”对话框中,输⼊需要转换的栅格数据名称,以及转换后新的栅格数据名称。图 78 栅格数据格式转换窗⼝图 79 转换成功提⽰框图 80 转换结果

1) 栅格影像拼接前准备利⽤ArcCatalog创建个⼈数据库,⽤以存放镶嵌影像图 81 创建个⼈地理数据库在新建的个⼈地理数据库中新建⼀个名为“RasterCatalog”的⽬录图 82 创建栅格⽬录在新建的栅格⽬录中装载影像图 83 装载影像装载成功后看到栅格⽬录下已存在两个影像图图 84 影像图 85 影像2) 添加控件和类库引⽤在程序的主菜单项“栅格管理”下增加菜单项“影像镶嵌”,控件名为“miRasterMosaic”。向当前项⽬添加DataSourcesGDB类库引⽤,并向中添加代码。图 86 添加“影像镶嵌”菜单项3) 添加“影像镶嵌”函数向栅格⼯具类RasterUtil添加“影像镶嵌”函数,将1)中引⼊的两幅影像镶嵌成⼀幅影像。图 87 添加“Mosaic”成员函数图 88 添加“Mosaic”成员函数4) 添加“影像镶嵌”事件图 89 “影像镶嵌”事件响应函数5) 运⾏结果运⾏程序,点击“栅格管理”下的“影像镶嵌”,并将⽣成的⽂件添加⾄地图。图 90 镶嵌成功提⽰框图 91 镶嵌结果1) 添加控件图 92 添加“栅格统计”菜单项2) 添加“栅格统计”函数向栅格⼯具类RasterUtil添加“栅格统计”函数,统计栅格影像的均值和标准差。图 93 添加“RasterStistics”成员函数图 94 添加“GetRasterStatistics”成员函数3) 添加“栅格统计”事件图 95 “栅格统计”事件响应函数4) 运⾏结果运⾏程序,统计融合后的栅格影像信息图 96 统计结果

这次的GIS⼆次开发实习,让我学会了很多东西,⽐如解决问题的能⼒,虽然这次实习的内容书上都有,但是书上的有些代码运⾏不了,然后⾃⼰去查找相应的资料,去解决它,特别是⼆次开发的帮助⽂档,给我解决了很多问题,所以说,写代码⼀定不能照搬照⽤,⼀定要学会灵活运⽤,同时,在不断学习的过程中,对⼆次开发有了⼀个初步的了解,然后对书上的⼀些代码进⾏了改进,⽐如,添加⼀些提⽰框和捕获异常语句等,但是我知道,这是远远不够的,需要学习的东西还有很多。⽼师对于⼆次开发知识的详细讲解,让我受益匪浅,⼀些难以理解的概念,⽼师⽤通俗易懂的语⾔和形象⽣动的⽐喻,让我对于接⼝和类的概念有了⼀个深⼊的了解,并且让我在上机操作中更好地运⽤它们,⽼师的帮助⽆疑是巨⼤的,所以⾮常感谢⽼师的⾟勤付出,同时,我也会不断地学习下去,让⾃⼰变得更强。

发布者:admin,转转请注明出处:http://www.yc00.com/news/1688188855a95024.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信