已阅读5页,还剩61页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
GIS工程设计开发综合实习 黄长青 基于C NET和AO AE的GIS设计与开发 2 Part5 ArcGISEngine二次开发入门 3 ArcGISEngine二次开发入门 5 1ArcGISEngine简介5 2ArcGISEngine开发起步5 3属性查询5 4空间查询5 5BaseCommand开发实例5 6BaseTool开发实例5 7通过代码添加图层5 8构建一个简单的GIS应用5 9问题解决方法及帮助文档的使用 5 1ArcGISEngine简介 ArcGISEngine的功能十分强大 作为ArcGISEngine开发者 您可以实现以下列出的和其他更多的功能 这包括 用多个图层来显示地图 例如道路 水系 边界等地图的漫游和缩放地图上要素的确认地图上要素的查询和定位根据属性值显示注记根据航片或者卫片显示图像绘制几何图形 例如点 线 弧 多边形添加描述性的文字 沿着线选择或者选择矩形 某一范围内 多边形等内部的要素选择距离在某一范围内的要素利用SQL语言来寻找和选择要素利用专题地图来渲染要素 如唯一值法 分级法和点状密度法动态显示实时地图或者时序数据根据地理编码来寻找位置转换您地图的坐标系根据几何操作来生成缓冲区 计算差值 或者进行求交 求并等运算编辑要素形状或者旋转地图创建并更新要素的几何形状及其属性 编辑要素 EditingFeatures ArcGISEngine开发包让您构建出能创建 修改和删除geodatabase中矢量要素或者shapefile文件的应用程序 标准的ArcGISEngineRuntime能够让编辑shapefile文件或者personalgeodatabase中简单要素的程序运行 然而 要构建企业级geodatabase的全部功能 就需要ArcGISEngineRuntime中的GeodatabaseUpdate选项 空间建模和分析 空间建模和通过增加ArcGISEngineRuntime中的Spatial选项 您能够扩展ArcGISEngine的功能 这个选项 Spatial选项 能提供一系列强劲的空间建模和分析功能 您能够创建 查询 表达和分析基于象元的栅格数据 能够集成栅格和矢量数据进行分析 能够从已有数据挖掘出新的信息 能够从多层数据中查询信息 能够在ArcGISEngine应用程序中完美集成基于象元的栅格数据和矢量数据 三维可视化等 ArcGISEngineRuntime中的3D选项让您通过使用Scene和Globe控件来有效的表达和分析区域及全球数据 例如 您能够 显示Scene和Globe文档展示交互性的透视图 包括漫游 缩放 旋转 倾斜 模拟飞行以便于表达和分析显示真实世界的表面要素 例如楼房展示视域和可见范围分析 场景高度内插 剖面分析和最短距离分析 这个例子将引导您创建第一个简单的地图显示程序 并添加基本的缩放和漫游功能 如果您之前没有接触过ArcGISEngine的开发 那么这个例子是您迈入ArcGISEngine二次开发大门的极好例子 如果您之前没有接触C NET 也无需担心 这个例子将从零开始引导您一步一步完成任务 5 2ArcGISEngine开发起步 第一个简单的地图显示程序 首先打开MicrosoftVisualStudio2005 点击菜单栏中的 文件 新建项目 在弹出的对话框中选择新建一个C 的Windows应用程序 之后更改项目名称为 MapView 更改文件的路径为个人实习文件夹 点击 确定 即可 创建一个新的工程 图23新建项目对话框 点击编译器最左侧的 工具箱 在弹出的选择项中找到 ArcGISWindowsForms 项 单击其中的MapControl 之后在Form1的空白处单击鼠标左键不放并拖拽鼠标 直到调整MapControl到合适的大小再松开鼠标 您也可以直接在工具箱中双击MapControl 该控件则会自动加入到Form1中 用同样的方法 再将LicenseControl添加到Form1中 添加控件及引用 图24工具箱 如果您在工具箱中找不到MapControl 则请依次尝试以下两种解决方案 首先单击工具栏 待工具箱弹出之后 在工具箱的任意位置上单击鼠标右键 从弹出菜单中选择 重置工具箱 如果这一步操作之后仍然无法看到MapControl 则请滑动工具栏右侧的滚动条至最底部 找到 常规 选项卡 然后在 常规 选项卡上单击鼠标右键 在弹出菜单中单击 选择项 I 在弹出的对话框中找到 AxLicenseControl 和 AxMapControl 将这两项前的复选框打上勾 最后点击确定即可 如果在 NETFramework组件 这个面板中找不到这两项 则选择 COM组件 面板 在 ESRILicenseControl 和 ESRIMapControl 前面打勾 图25重置工具箱 图26选择项 图27选择工具箱项 图28选择工具箱项 添加好MapControl和LicenseControl之后 调整Form1和MapControl的位置与大小 如下图所示 图29窗体布局 在MapControl上单击鼠标右键 选择 属性 则会弹出MapControl的属性设置面板 在之前也介绍过 通过这个面板可以完成许多简单的工作 如图所示 点击 Map 面板 之后点击按钮 在弹出的对话框中选择下图所示的路径 注 笔者的ArcGIS安装在D盘 若您的ArcGIS装在别的盘符 请做相应修改 再在此路径下选择 States 点击 Open 之后在MapControl的属性页上点击 确定 即可 添加地图 图30文件添加路径 至此 我们已经完成了一个最简单的地图显示程序 下面一起来看一下成果吧 点击 启动调试 按钮 或者在 调试 菜单下选择相应命令 或者按键盘的F5键 可以得到如下的运行结果 图31 启动调试 按钮 图32初次运行结果 我们没有书写任何代码 就得到了一个最简单的地图显示程序 但这个程序还不能与用户交互 下一步我们需要添加一些代码 让程序能响应用户的鼠标 完成放大和全图显示的功能 添加基本的代码 图33MapControl控件支持的所有方法 双击MapControl控件 可以进入代码编辑界面 从窗口上方的下拉列表框中 我们能够看到MapControl能够响应的所有事件 关于每个事件的详细使用方法等请参见帮助系统 第六章对帮助系统有更加详细的介绍 双击MapControl进入代码编辑界面的时候 默认的是 OnMouseDown 事件 下一步就需要在这个事件中添加响应鼠标的相关代码 请您在PrivateSubAxMapControl1 OnMouseDown函数中添加如下代码 if e button 1 this axMapControl1 Extent this axMapControl1 TrackRectangle elseif e button 2 this axMapControl1 Extent this axMapControl1 FullExtent 再次运行程序 鼠标左键在地图上拉框可以实现地图的放大功能 而右键单击地图则会还原地图的全图显示 图34任意比例尺放大功能 如果将代码替换如下 则能实现左键放大 右键漫游的功能 if e button 1 this axMapControl1 Extent this axMapControl1 TrackRectangle elseif e button 2 this axMapControl1 Pan 下面我们依次来看看这些代码都代表什么意思 首先看来第一段 if e button 1 this axMapControl1 Extent this axMapControl1 TrackRectangle elseif e button 2 this axMapControl1 Extent this axMapControl1 FullExtent 这个代码是一个IfElse条件语句 关于 e 的详细定义及其中包含的各参数 请参考帮助中与 IMapControlEvents2 OnMouseDownEventHandlerdelegate 关键字相关的内容 代码解释 可以根据e中包含的 button 值来判断鼠标的单击操作是来自何处 若button值为1 则为鼠标左键 2代表鼠标右键 4代表鼠标中键 当判断得到是鼠标左键单击时 执行 AxMapControl1 Extent AxMapControl1 TrackRectangle 这条语句 其中 等号右侧是调用了 TrackRectangle 方法 这个方法是在地图上拖拽出一个矩形 之后将这个矩形赋值给当前地图的显示区域 Extent 这样就实现了地图的放大功能 类似的 若鼠标右键单击 则将全图范围赋值给当前的显示范围 实现了地图的全图显示功能 第二段代码与第一段结构一样 只是在右键的相应事件上略有不同 这是调用了 Pan 方法 实现了地图的漫游功能 通过这个例子 我们制作出了一个最简单的地图浏览程序MapView 并能响应一些基本的鼠标操作 在MapControl的属性页中 其实还有许多内容您可以尝试 例如在 General 面板中可以直接加入地图文件 mxd或者 mxt 您也可以利用刚才的方式一次性多加入一些图层而不仅仅加入 States 一个 同时可以更改各图层的叠放次序 也可以在 Data 面板中设置地图的旋转角度 Rotation 等 您还可以设置MapControl的显示方式 是否支持地图的预览功能 边框样式等等 您可以做一些尝试 看看能得到哪些有趣的结果 这些尝试对您今后熟悉ArcGISEngine的开发是有一定帮助的 如果需要重置MapControl 只需要点击 Data 面板中的 Reset 按钮 当您完成了这个例子 并做了一些积极的尝试之后 您就可以接着学习下一个小节的内容了 小结 查询是GIS中非常重要的一个功能 下面将分别介绍属性查询和空间查询的制作方法 5 3属性查询 添加控件 如果上一小节的工程已经关闭 则将其打开 如果您之后又在MapControl中添加了一些别的数据 请将其删除 只保留一个 states 图层 请务必注意这一步 这直接关系到您下面的工作能否顺利进行 用之前讲过的方式 在窗体中添加一个Label和一个TextBox 将Label的 Text 属性修改为 StateName 结果如下 图35Label控件和TextBox控件 首先添加引用 点击菜单栏上的 项目 添加引用 在弹出的对话框中同时选择 ESRI ArcGIS Carto 和 ESRI ArcGIS Geodatabase 选择的时候按下Ctrl键以同时选择多个 点击确定 之后双击TextBox1控件 进入代码编辑界面 在代码编辑区域的最上方输入以下内容 usingESRI ArcGIS Carto usingESRI ArcGIS Geodatabase 如下图所示 添加引用和代码 图36引用添加位置 图37添加引用对话框 之后在控件TextBox的事件中选择KeyUp 在KeyUp事件中添加以下代码 图38KeyPress方法 if e KeyCode Keys Enter 定义图层 要素游标 查询过滤器 要素IFeatureLayerpFeatureLayer IFeatureCursorpFeatureCursor IQueryFilterpQueryFilter IFeaturepFeature 获取图层pFeatureLayer this axMapControl1 Map get Layer 0 asIFeatureLayer 如果图层名称不是states 程序退出if pFeatureLayer Name states return 清除上次查询结果this axMapControl1 Map ClearSelection pQueryFilter的实例化pQueryFilter newQueryFilterClass 设置查询过滤条件pQueryFilter WhereClause STATE NAME txtStateName Text 查询pFeatureCursor pFeatureLayer Search pQueryFilter true 获取查询到的要素pFeature pFeatureCursor NextFeature 判断是否获取到要素if pFeature null 选择要素this axMapControl1 Map SelectFeature pFeatureLayer pFeature 放大到要素this axMapControl1 Extent pFeature Shape Envelope else 没有得到pFeature的提示MessageBox Show 没有找到名为 txtStateName Text 的州 提示 运行程序 分别向编辑框中输入 Texas 和 RS 键入回车 如下图所示 图39Texas州查询结果 图40RS查询结果 if e KeyCode Keys Enter 上述代码是一个判断语句 即当用户输入回车的时候 开始进行查询 下面两行代码是定义查询的范围 默认为上一小节中添加的图层 states 如果找不到这个图层则自动退出 获取图层pFeatureLayer this axMapControl1 Map get Layer 0 asIFeatureLayer 如果图层名称不是states 程序退出if pFeatureLayer Name states return 清除上次查询结果this axMapControl1 Map ClearSelection 这一部分是生成一个新的查询器 选择条件 WhereClause 就是检索是否有与用户输入相符的州 并将结果从查询得到的pCursor中读取出来 代码解释 判断是否获取到要素if pFeature null 选择要素this axMapControl1 Map SelectFeature pFeatureLayer pFeature 放大到要素this axMapControl1 Extent pFeature Shape Envelope else 没有得到pFeature的提示MessageBox Show 没有找到名为 txtStateName Text 的州 提示 这一部分是一个判断语句 若查询得到的结果为空 则刷新地图 弹出对话框通知用户没有查询到结果 并退出程序 如果查询得到的结果不为空 则将这个结果加入地图的选择集 并将地图的显示范围定为查询结果的外轮廓 这样得到的州将高亮显示同时居中放大到屏幕中心 这一部分中 我们接触到了基本的属性查询 但是在这个例子中 我们不能实现对属性表中任意属性字段的查询 在这个程序中 我们只能查询州名 STATE NAME 而不能对别的字段进行查询 而且这个查询不支持模糊查询 为了使查询变的更加丰富 更加人性化 请您参考IQueryFilter接口中WhereClause属性的设置方法 拓展WhereClause可以得到许多有趣的结果 在书写代码的过程中 对任何有疑问的地方 或者您想要拓展的位置 都可以在帮助系统中查询相关的接口和属性 查看最原始的定义 帮助系统中的解释和定义对于您熟悉ArcObjects 熟悉ArcGISEngine的二次开发以及后续的工作都是十分重要的 请一定不要忽视这个环节 如果您已经尝试了一些变化 或者对本小节的内容比较熟悉了 则可以进入下一小节的学习 小结 上一小节我们已经学习了如何进行属性查询 在这一小节中 我们将继续学习GIS中的另一种查询方式 空间查询 如果上一小节的工程已经关闭 则将其打开 如果您之后又在MapControl中添加了一些别的数据 请将其删除 只保留一个 states 图层 请务必注意这一步 这直接关系到您下面的工作能否顺利进行 我们接着上一小节的内容继续完善 在窗体中添加一个Button 将其Text属性修改为 点查询 5 4空间查询 添加控件 图41添加 点查询 按钮 利用上一小节讲的方式 添加引用 ESRI ArcGIS Geometry 并在类中添加一个全局变量nMouseFlag 如下图所示 添加引用和代码 图42添加引用 ESRI ArcGIS Geometry 之后在类中添加一个公共函数 用来根据屏幕像素计算实际的地理距离privatedoubleConvertPixelToMapUnits IActiveViewactiveView doublepixelUnits doublerealWorldDiaplayExtent intpixelExtent doublesizeOfOnePixel doublemapUnits 获取设备中视图显示宽度 即像素个数pixelExtent activeView ScreenDisplay DisplayTransformation get DeviceFrame right activeView ScreenDisplay DisplayTransformation get DeviceFrame left 获取地图坐标系中地图显示范围realWorldDiaplayExtent activeView ScreenDisplay DisplayTransformation VisibleBounds Width 每个像素大小代表的实际距离sizeOfOnePixel realWorldDiaplayExtent pixelExtent 地理距离mapUnits pixelUnits sizeOfOnePixel returnmapUnits 此后 双击Button1 进入Button的Click事件 向其中添加如下代码 标记点查询mMouseFlag 1 设置鼠标形状this axMapControl1 MousePointer ESRI ArcGIS Controls esriControlsMousePointer esriPointerCrosshair 注 上两行代码应该书写在一行 由于空间有限 这里写为两行 最后将MapControl控件的OnMouseDown事件中已有的代码清除 替换为以下代码 if mMouseFlag 1 IFeatureLayerpFeatureLayer IFeatureClasspFeatureClass 获取图层和要素类 为空时返回pFeatureLayer this axMapControl1 Map get Layer 0 asIFeatureLayer if pFeatureLayer Name states return pFeatureClass pFeatureLayer FeatureClass if pFeatureClass null return IActiveViewpActiveView IPointpPoint doublelength 获取视图范围pActiveView this axMapControl1 ActiveView 获取鼠标点击屏幕坐标pPoint pActiveView ScreenDisplay DisplayTransformation ToMapPoint e x e y 2个像素大小的屏幕距离转换为地图距离length ConvertPixelToMapUnits pActiveView 2 ITopologicalOperatorpTopoOperator IGeometrypGeoBuffer ISpatialFilterpSpatialFilter 根据缓冲半径生成空间过滤器pTopoOperator pPointasITopologicalOperator pGeoBuffer pTopoOperator Buffer length pSpatialFilter newSpatialFilterClass pSpatialFilter Geometry pGeoBuffer 根据图层类型选择缓冲方式switch pFeatureClass ShapeType caseesriGeometryType esriGeometryPoint pSpatialFilter SpatialRel esriSpatialRelEnum esriSpatialRelContains break caseesriGeometryType esriGeometryPolyline pSpatialFilter SpatialRel esriSpatialRelEnum esriSpatialRelCrosses break caseesriGeometryType esriGeometryPolygon pSpatialFilter SpatialRel esriSpatialRelEnum esriSpatialRelIntersects break 定义空间过滤器的空间字段pSpatialFilter GeometryField pFeatureClass ShapeFieldName IQueryFilterpQueryFilter IFeatureCursorpFeatureCursor IFeaturepFeature 利用要素过滤器查询要素pQueryFilter pSpatialFilterasIQueryFilter pFeatureCursor pFeatureLayer Search pQueryFilter true pFeature pFeatureCursor NextFeature intfieldIndex if pFeature null 选择指定要素this axMapControl1 Map ClearSelection this axMapControl1 Map SelectFeature ILayer pFeatureLayer pFeature this axMapControl1 Refresh fieldIndex pFeature Fields FindField STATE NAME MessageBox Show 查找到 pFeature get Value fieldIndex 提示 运行程序 结果如右图所示 图43空间查询运行结果 距离转换函数请您自行参看帮助系统中对相关接口的具体定义和解释 Button1的Click事件中是将nMouseFlag设置为1 并将鼠标在MapControl上的形状改变为十字丝状 获取视图范围pActiveView this axMapControl1 ActiveView 获取鼠标点击屏幕坐标pPoint pActiveView ScreenDisplay DisplayTransformation ToMapPoint e x e y 屏幕距离转换为地图距离length ConvertPixelToMapUnits pActiveView 2 上述代码是在MapControl的OnMouseDown事件中 当您单击鼠标左键的时候 将屏幕上的点转换成地图上的点 关键在于坐标值的转换 方便后续操作 根据缓冲半径生成空间过滤器pTopoOperator pPointasITopologicalOperator pGeoBuffer pTopoOperator Buffer length pSpatialFilter newSpatialFilterClass pSpatialFilter Geometry pGeoBuffer 代码解释 这一部分是将2个像素的距离转换成实际的地理距离 并以这个距离为半径 上一步生成的点为中心 生成一个缓冲区 上述代码是设置pSpatialFilter的各项参数 供后续查询 包括空间查询的几何形状 之前生成的缓冲区 空间查询的方式 相交 包含等 以及Shape字段 这两句代码是找出 STATE NAME 所在的列数 并将其显示出来 在本节中我们完成更多的空间查询功能 其中有点查询 线查询 矩形查询 圆查询新建一个C Net工程 向工程中添加控件 如下图所示 其中包括MapControl 4个Button 一个TextBox 进一步完善空间查询 通过在控件属性中添加地图的方法 向Mapcontrol中添加例子数据 例子数据是位于World文件夹下的Continents lyr 如下图所示 下面我们在MainForm的代码页添加空间查询的函数 本例中我们需要添加ESRI ArcGIS Carto ESRI ArcGIS Geometry ESRI ArcGIS Geodatabase ESRI ArcGIS Controls四个个命名空间 并且我们仍然需要上节中的ConvertPixelToMapUnits IActiveViewactiveView doublepixelUnits 函数 请自行添加 空间查询函数代码如下 空间查询 MapControl 空间查询方式 字段名称 查
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 洗衣液代加工合同范本
- 猪肉长期供货合同范本
- 私企合伙人合同协议书
- 瓷砖空鼓装修合同范本
- 生产部安全生产协议书
- 空调工程转让合同范本
- 生鲜公司劳动合同范本
- 银行安全工作笔记讲解
- 海洋经济考核方法
- 全州民营经济发展现状报告
- 2025至2030全球及中国花生行业项目调研及市场前景预测评估报告
- 小学消防安全课件演示
- 2026年南宁市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(培优a卷)
- 2025年英语专业专升本模拟试卷真题(含答案)
- 2025年江苏(统招专升本)英语考试试题及答案
- 2025年儿童营养与健康知识竞赛答案及解析
- 2025乌鲁木齐银行秋季招聘备考考试题库附答案解析
- 思维导图在护理工作应用
- 北师大版八年级上册数学 第5章 二元一次方程 问题解决策略:逐步确定 教案
- 开展集中整治群众身边不正之风和腐败问题工作总结汇报
- 工厂安全与环保知识培训课件
评论
0/150
提交评论