



版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、GIS 二次开发实验实验报告学院:测绘工程学院专业:地理信息系统班级:1123101姓名:岳志鹏学号:201120310114课程名称:Supermap objects 组件式开发指导老师:徐效波2014年 01月目录GIS 二次 开发实 验 .- 1 -一、实验背景 .- 3 -二、实验目的 .- 3 -三、实验内容及过程 .- 3 -实验一:快速入门 .- 3 -1.新 建 项 目 .- 3 -2.数 据 准 备 .- 4 -3.添 加 控 件 .- 4 -4.添加菜单项 .- 5 -5控件的关联 .- 5 -6.打开工作空间 .- 6 -8.地图浏览操作 .- 7 -9.显示属性信息 .
2、- 8 -10. 地 图 量 算 .- 9 -实验二:查询功能 .-10-1、案例分析 .-10-2、准备的数据 .-10-3、主要使用的接口和操作 .-11-(1)查找 Missouri 河: .-11-(2)查询 Missouri 河穿过的州: .-12-(3)查询 Missouri 河 200 公里以内的县: .-14-(4) 查询 South Dakota 州包含的州: .-15-(5) 关联查询 South Dakota州的人口数: .-17-四、实验总结 .-19- 2 -一、实验背景近年来,随着社会信息化发展进程的不断推进,信息所具备的空间特性在众多社会活动公共行政决策和商业决策
3、中发挥的作用越来越大。地理信息系统(GIS) 作为一种获取、处理和分析空间信息的有效工具已经成为社会各行各业决策支持系统的重要组成部分。利用GIS 技术开发的以多媒体,网络化,自动化为特色的信息处理,信息管理,指挥调度和决策支撑系统,已经在各领域发挥着重大作用。基于 c#程序语言的supermapobjects 组件式开发可以针对用户的不同需求开发出人们实用的GIS 系统,所以二次开发具有非常重要的意义。通过 C# 环境下 GIS 系统的开发,探索了GIS 组件开发的理论与方法,为GIS 应用系统的高性能开发提供了更多的理论依据从而利于改进和提高利用组件开发的GIS 应用系统的质量,扩展GIS
4、 的应用领域。二、实验目的1、掌握利用SuperMap Objects + C# 来开发 GIS 系统。 C#是一种现代的面向对象语言。它使程序员快速便捷地创建基于Microsoft.NET 平台的解决方案。利用C# +SuperMap Objects 进行二次开发,熟悉对GIS 系统的二次开发。2、熟练应用 SuperMap 来操作地图,并对数据进行处理。掌握SuperMap Objects 开发GIS 系统的接口,方法。3、通过课程设计进一步掌握了地理信息系统与应用课程的有关知识,掌握了GIS 系统程序设计与开发课程的相关知识,掌握了进行系统定义、系统总体设计方法、系统详细设计、空间数据库
5、设计方法,掌握了利用开发语言和GIS 组件开发进行地理信息系统二次开发的能力,实现地理信息系统的基本功能和扩展功能,掌握面向对象进行程序设计的方法,并且可以建立空间数据库完成图形数据和属性数据的统一管理,将所学的内容加以综合,并且对GIS 的二次开发有了整体的理解,真正实现从课本到实践的应用。三、实验内容及过程实验一:快速入门1. 新建项目首先新建一个Windows 窗体应用程序名称为QuickStart 。- 3 -2. 数据准备请将本章范例项目QuickStart 中的 Data 文件夹复制到刚才新建的项目所在目录下。Data 文件夹共有 3 个文件,分别为 World.sdb 、Worl
6、d.sdd、 World.smw ,新建的项目目录和复制的数据目录3. 添加控件( 1)添加 SuperWorkspace 控件、SuperMap 控件、SuperLegend 控件、SuperWorkspaceManager控件。 SuperWorkspace 控件和 SuperMap 控件是 SuperMap Objects组件式GIS 的两大核心控件。 SuperWorkspace 控件主要完成数据的组织、管理等。SuperMap 控件主要用于地图显示、图层的管理、地图基本操作等。在“选择工具箱项”对话框中切换到 “COM 组件”选项卡,在列表框中选择“ SuperMap 控件”、“Su
7、perWorkspace 控件”、“ SuperLegend 控件”和“ SuperWorkspaceManager 控件”,添加成功后在工具箱中可以看到如图的效果。- 4 -(3)SuperLegend控件和SuperWorkspaceManager 控件是辅助控件。其中 SuperWorkspace Manager 控件帮助二次开发人员统一管理SuperWorkspace 控件中的所有资源,使他们从繁琐的程序处理中解脱出来,集中精力解决应用领域中的设计和实现问题; SuperLegend 控件会以树状结构显示与之相关联的地图窗口的图层信息。4. 添加菜单项5控件的关联SuperWorksp
8、ace 控件负责数据的组织管理,而SuperMap 控件用于显示数据,因此我们首先需要将 SuperWorkspace 控件和 SuperMap 控件关联起来;另外,SuperWorkspaceManager 控件将显示工作空间的内容,因此这个控件需要和SuperWorkspace 控件建立关联; SuperLegend控件用于显示当前地图窗口中打开的图层信息,因此我们还需要将SuperLegend 控件和SuperMap 控件进行关联。private void ConnectSuperMap()- 5 -/ 将地图控件与工作空间控件进行关联/ 将工作空间管理器控件与工作空间控件进行关联 /
9、将图例控件与地图控件进行关联axSuperLegend1.Connect(objSMHandle);ReleaseObjects(objWSHandle);ReleaseObjects(objSMHandle);6. 打开工作空间双击“打开工作空间”菜单项,在ToolStripOpenWS_Click事件中添加如下代码。这段代码将实现打开用户选择的工作空间文件(*.smw 格式 )。/ 打开对话框中选择的文件全路径,即将要打开的工作空间全路径this.ConnectSuperMap();/关联控件打开工作空间7. 打开数据集数据源是由各种类型的数据集组成的数据集集合。一个数据源可包含一个或多个
10、不同类型的数据集, 也可以同时存储矢量数据集和栅格数据集。数据源的存储格式由扩展名为SDB和 SDD 的两个文件组成。SDB 存储空间数据,SDD 为 Access 数据库,存储属性数据。数据集是由同种类型数据组成的数据集合,也就是一组数据对象的集合。SuperMap 支持十几种不同类型的数据集,如:点数据集、线数据集、面数据集、TIN 数据集、 GRID 数据集、 CAD 数据集、网络数据集、文本数据集等。首先为SuperWorkspaceManager控件添加鼠标左键双击事件axSuperWkspManager1_LDbClick,添加的方法请参照前面介绍的添加MainForm_FormC
11、losing- 6 -事件的方法。在该事件中加入如下代码, 实现双击打开数据集。另外, 该段代码还实现了双击打开工作空间中已有地图的功能。基础地图 ");数据集打开后, 将会在地图窗口中展现出来, 而图例窗口用于显示当前地图窗口中的图层信息,因此当打开一个数据集后, 需要刷新地图窗口,同时需要刷新图例窗口,这样在图例窗口中就可以立即看到这个新图层。8. 地图浏览操作在打开数据集或者打开地图之后, 本节我们要完成一系列对地图的基本操作, 包括对地图的放大、缩小、漫游、自由缩放、全幅显示以及单击选择。在 SuperMap Objects 中,通常与地图显示有关的操作都可以通过设置Supe
12、rMap 控件的Action属性完成。当Action的值为零时,表示不进行任何操作。点选 ControlState(seAction.scaSelect);放大ControlState(seAction.scaZoomIn);axSuperMap1.Action=/自 由 缩 放ControlState(seAction.scaZoomFree);平移ControlState(seAction.scaPan);axSuperMap1.ViewEntire();/全幅显示- 7 -9. 显示属性信息在 GIS 中,空间数据用于表示事物或现象的分布位置,而属性数据则用于说明事物和现象是什么。因而属
13、性数据在地理信息系统中也是不可缺少的。/ 双击对话框显示对象属性择集 ;soRecordset objRd=objSelection.ToRecordset(false);/转化为记录集 ;soFieldInfo objFieldinfo = null;if (objRd.RecordCount > 0) /如果当前有选中的对象string str = ""for (int i = 1; i <= objRd.FieldCount; i+)/字段信息objFieldinfo = objRd.GetFieldInfo(i);str += objFieldinfo.
14、Name; / 得到属性字段名称 str += ":" + objRd.GetFieldValue(i).ToString() + "n" /获得选将选择集提取所选对象的属性得到每个字段值MessageBox.Show(str, "属性 ");/弹出一个窗体显示选中对象的所有属性字段值objRd.Close(); /关闭记录集/释放变量 - 8 -10. 地图量算int nMeasureMode = 0; /0 代表无量算,1 长度, 2 角度, 3 面积/其他代码 在菜单“量算”“长度”的单击事件mnuMeasureDistance
15、_Clickprivate void mnuMeasureDistance_Click(object sender, EventArgs e)soTrackingLayer objTLayer = axSuperMap1.TrackingLayer;/ 获得跟踪层对象 objTLayer.ClearEvents(); / 清除跟踪层所有几何事件对象axSuperMap1.Action = seAction.scaTrackPolyline; / 设置当前鼠标状态为在内存中画折线 ReleaseObjects(objTLayer);nMeasureMode = 1;/ 量算长度objTLayer
16、 = null;ControlState(seAction.scaTrackPolyline);/ 控制菜单状态将鼠标状态设置为在内存中绘制折线后,通过axSuperMap1_Tracking 事件处理绘制结果,在状态栏上显示绘制折线的总长度和折线最后一段的长度。privatevoidaxSuperMap1_Tracking(objectsender,AxSuperMapLib._DSuperMapEvents_TrackingEvent e)if (e.dCurrentLength > 0 && nMeasureMode = 1) /当前绘制的折线最后一段的长度长度if
17、 (e.dTotalLength > 0 && nMeasureMode = 1) /当前绘制的折线总长度总长度 在绘制结束时执行的事件 axSuperMap1_Tracked 中将鼠标状态设置为点选, 并设置菜单的状态。private void axSuperMap1_Tracked(object sender, EventArgs e)mnuMeasureDistance.Checked = false; / 设置菜单状态mnuMeasureArea.Checked = false;mnuMeasureAngle.Checked = false;axSuperMap1
18、.Action = seAction.scaSelect;/ 设置当前鼠标状态为点选- 9 -实验二:查询功能1、案例分析本功能实现通过使用一幅美国行政区划图实现查找Missouri河、查询 Missouri 河穿过的州、查询 Missouri河 200公里以内的县、查询South Dakota州包含的州和关联查询SouthDakota 州的人口数的功能。本章是在上一功能的基础上开发的,且不需要添加特殊的控件,所以控件和上一功能的一样。2、准备的数据-10-3、主要使用的接口和操作( 1)查找 Missouri 河:通过查询操作soDatasetVector.Query(), soRecord
19、set.GetGeometry()获得查询到的对象soGeometry ,调用 soTrackingLayer.AddEvent()将查询到的对象添加到临时图层上显示。代码: private void ToolStripQueryMissouri_Click(object sender, EventArgs e)/查询 Missouri 河,用到简单的 SQL查询,将查询结果放到临时图层上始终显示 soLayers objLayers = axSuperMap1.Layers;soLayer objLayer = objLayers"RiversLus"if (objLay
20、er = null)MessageBox.Show("请打开地图地图", "提示 ");ReleaseObjects(objLayers);return;soDataset objDataset = objLayer.Dataset;soDatasetVector objDatasetVector = (soDatasetVector)objDataset; soRecordset objRecordset = objDatasetVector.Query("RIVER_NAME ='Missouri1'", true
21、, null, "");if (objRecordset != null)int n = objRecordset.RecordCount;soGeometry objGeo = objRecordset.GetGeometry(); soTrackingLayer objTrackingLayer = axSuperMap1.TrackingLayer; soStyle objStyle = new soStyle();objStyle.PenWidth = 10;objStyle.PenColor = (uint)ColorTranslator.ToOle(Color.
22、Red);objTrackingLayer.AddEvent(objGeo, objStyle, "Missouri1");axSuperMap1.Refresh();objRecordset.Close();ReleaseObjects(objStyle);ReleaseObjects(objTrackingLayer);ReleaseObjects(objGeo);ReleaseObjects(objRecordset);ReleaseObjects(objLayers);ReleaseObjects(objLayer);ReleaseObjects(objDatase
23、t);ReleaseObjects(objDatasetVector);-11-( 2)查询 Missouri 河穿过的州:先用 a的方法查出 Missouri 的几何对象,再调用空间查询 soDatasetVector .QueryEx(),并调用 soSelection .FromRecordset ()将查询到的对象添加到选择集并高亮显示。代码: private void ToolStripQueryState_Click(object sender, EventArgs e)/查询 Missouri河穿过的州,空间查询soLayers objLayers = axSuperMap1.L
24、ayers;soLayer objLayer = objLayers"RiversLus"if (objLayer = null)MessageBox.Show("请打开地图 ", "提示 ");ReleaseObjects(objLayers);return;soDataset objDataset = objLayer.Dataset;soDatasetVector objDatasetVector = (soDatasetVector)objDataset; soRecordset objRecordset = objDatas
25、etVector.Query("RIVER_NAME ='Missouri1'", true, null, "");/首先查询出铜山县这个面对象if (objRecordset != null)/如果查找出来了线再查找它所经过的面soGeometry objGeo = objRecordset.GetGeometry(); /获得 Missouri 河线对象soLayerobjLayerR= objLayers"StatesRus" /获取州图层作为待查找图层soDataset objDatasetR = objLay
26、erR.Dataset;soDatasetVector objDatasetVectorR =-12-(soDatasetVector)objDatasetR;soRecordset objRecordsetR = objDatasetVectorR.QueryEx(objGeo,seSpatialQueryMode.scsLineCross, "");if (objRecordsetR != null)soSelection objSel = axSuperMap1.selection;objSel.FromRecordset(objRecordsetR);/把带有几何对
27、象的记录集转化为选择集objRecordsetR.Close();ReleaseObjects(objSel);ReleaseObjects(objRecordsetR);objRecordset.Close();ReleaseObjects(objGeo);ReleaseObjects(objLayerR);ReleaseObjects(objDatasetR);ReleaseObjects(objDatasetVectorR);ReleaseObjects(objRecordset);ReleaseObjects(objLayers);ReleaseObjects(objLayer);Re
28、leaseObjects(objDataset);ReleaseObjects(objDatasetVector);axSuperMap1.ViewEntire();axSuperMap1.Refresh();-13-( 3)查询 Missouri 河 200 公里以内的县:先 用 a 的 方 法 查 出 Missouri的 几 何 对 象 , 再 执 行 距 离 查 询soDatasetVector.QueryByDistance (),调用 soSelection .FromRecordset()将查询到的对象添加到选择集并高亮显示。代码: private void ToolStripQu
29、eryCounty_Click(object sender, EventArgs e)/查询 Missouri河200公里以内的县距离查询soLayers objLayers = axSuperMap1.Layers;soLayer objLayer = objLayers"RiversLus"if (objLayer = null)MessageBox.Show("请打开地图 ", "提示 ");ReleaseObjects(objLayers);return;soDataset objDataset = objLayer.Data
30、set;soDatasetVector objDatasetVector = (soDatasetVector)objDataset; soRecordset objRecordset = objDatasetVector.Query("RIVER_NAME ='Missouri1'", true, null, "");/首先查询出 Missouri河这个线对象if (objRecordset != null)/如果查找出来了而再查找它所包含的线soGeometry objGeo = objRecordset.GetGeometry();
31、 /获得 Missouri河这个线对象soLayerobjLayerR= objLayers"CountiesRus" /获取县图层作为待查找图层soDataset objDatasetR = objLayerR.Dataset;soDatasetVector objDatasetVectorR =(soDatasetVector)objDatasetR;soRecordset objRecordsetR =objDatasetVectorR.QueryByDistance(objGeo, 200000, "");if (objRecordsetR !=
32、 null)soSelection objSel = axSuperMap1.selection;objSel.FromRecordset(objRecordsetR);/把带有几何对象的记录集转化为选择集axSuperMap1.EnsureVisibleRecordset(objRecordset);/使选中的记录能够最大化显示axSuperMap1.Zoom(0.6);objRecordsetR.Close();ReleaseObjects(objSel);ReleaseObjects(objRecordsetR);objRecordset.Close();-14-ReleaseObjec
33、ts(objGeo);ReleaseObjects(objLayerR);ReleaseObjects(objDatasetR);ReleaseObjects(objDatasetVectorR);ReleaseObjects(objRecordset);ReleaseObjects(objLayers);ReleaseObjects(objLayer);ReleaseObjects(objDataset);ReleaseObjects(objDatasetVector);axSuperMap1.Refresh();(4) 查询 South Dakota州包含的州:实现的过程和步骤与“查询Mi
34、ssouri 河穿过的州”相同。代码: private void ToolStripQuerytown_Click(object sender, EventArgs e)/查询 South Dakota 州包含的镇空间查询soLayers objLayers = axSuperMap1.Layers;soLayer objLayer = objLayers"StatesRus"if (objLayer = null)MessageBox.Show("请打开地图 ", "提示 ");Marshal.ReleaseComObject(ob
35、jLayers);return;soDataset objDataset = objLayer.Dataset;soDatasetVector objDatasetVector = (soDatasetVector)objDataset; soRecordset objRecordset = objDatasetVector.Query("STATE_NAME =-15-'South Dakota'", true, null, "");/首先查询出 South Dakota 这个面对象if (objRecordset != null)/如
36、果查找出来了而再查找它所包含的县soGeometry objGeo = objRecordset.GetGeometry(); /获得 SouthDakota 这个面对象soLayerobjLayerL= objLayers"CountiesRus" /获取铁路图层作为待查找图层soDataset objDatasetL = objLayerL.Dataset;soDatasetVector objDatasetVectorL =(soDatasetVector)objDatasetL;soRecordset objRecordsetL = objDatasetVector
37、L.QueryEx(objGeo, seSpatialQueryMode.scsContaining, "");if (objRecordsetL != null)soSelection objSel = axSuperMap1.selection;objSel.FromRecordset(objRecordsetL);/把带有几何对象的记录集转化为选择集axSuperMap1.EnsureVisibleRecordset(objRecordset);/使选中的记录能够最大化显示axSuperMap1.Zoom(0.5);String strName = "&qu
38、ot;String strTemp = ""while (!objRecordsetL.IsEOF()strTemp =objRecordsetL.GetFieldValue("COUNTY_NAM").ToString();strName = strName + "" + strTemp;objRecordsetL.MoveNext();strName = strName.Substring(5, strName.Length - 5);axSuperMap1.Refresh();MessageBox.Show(strName, &
39、quot;South Dakota 州包含的镇 "); objRecordsetL.Close();ReleaseObjects(objSel);ReleaseObjects(objRecordsetL);objRecordset.Close();ReleaseObjects(objGeo);ReleaseObjects(objLayerL);ReleaseObjects(objDatasetL);ReleaseObjects(objDatasetVectorL);ReleaseObjects(objRecordset);ReleaseObjects(objLayers);-16-R
40、eleaseObjects(objLayer);ReleaseObjects(objDataset);ReleaseObjects(objDatasetVector);( 5) 关联查询 South Dakota 州的人口数:新 建 soRelQueryTableInfo对 象 , 设 置 被 关 联 数 据 集 的 相 关 参 数 , 新 建soRelQueryTableInfos对象,添加一个或多个soRelQueryTableInfo对象,新建 soQueryDef对象,设置查询方式、查询字段、查询条件,设置关联表信息soRelQueryTableInfos对象,通过 soDataset
41、Vector.QueryDef()函数查询符合条件的记录,得到记录集,通过记录集soRecordset .GetFieldValue()获得关联查询到的值。代码: private void ToolStripQueryPopulation_Click(object sender, EventArgs e)/关联查询 South Dakota 州的人口数soLayers objLayers = axSuperMap1.Layers;soLayer objLayer = objLayers"StatesRus"if (objLayer = null)MessageBox.Sho
42、w("请打开示范数据");ReleaseObjects(objLayers);return;soDataset objDataset = objLayer.Dataset;soDatasetVector objDV = (soDatasetVector)objDataset;-17-soRelQueryTableInfos objRelTables = new soRelQueryTableInfos();soRelQueryTableInfo objRelTable = new soRelQueryTableInfo();objRelTable.TableName = "StatesRPop"/与之相连接的表objRelTable.SearchCondi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 管道工程社会责任与企业文化建设考核试卷
- 糖批发企业品牌推广策略考核试卷
- 刨花板生产过程中的质量控制与品质提升考核试卷
- 机电组件的绿色制造与循环经济考核试卷
- 航空器维修与故障排除考核试卷
- 跨境电商与国际市场的投资机遇与风险考核试卷
- 营养师职业素养与伦理考核试卷
- 盐的采集与利用中的产品质量控制考核试卷
- 货运火车站操作规程与实践考核试卷
- 装饰材料陈列展示技巧考核试卷
- 《答司马谏议书》同步练习-统编版高中语文必修下册
- 森林公安派出所台帐全套表格模板
- CB/T 3766-1996排气管钢法兰及垫片
- 11471劳动争议处理(第5章)
- 传热学课后习题答案
- 登临诗 诗歌赏析
- 免修申请表(模板)
- 电阻的测量-伏安法的实验报告
- 公司应急救援物资台账
- 超限梁板支撑架专项施工方案(滨州医院)
- 最新中山市中小学校情况一览表
评论
0/150
提交评论