《2022年二次开发实习报告》由会员分享,可在线阅读,更多相关《2022年二次开发实习报告(19页珍藏版)》请在金锄头文库上搜索。
1、GIS二次开发实验实验报告学院:测绘工程学院专业:地理信息系统班级:1123101姓名:岳志鹏学号:201120310114课程名称:Supermap objects 组件式开发指导老师:徐效波2014年 01月精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 19 页- 2 - 目录GIS 二次 开 发实 验 . - 1 - 一、实验背景 . - 3 - 二、实验目的 . - 3 - 三、实验内容及过程 . - 3 - 实验一:快速入门 . - 3 - 1. 新 建 项 目 . - 3 - 2. 数 据 准 备 . - 4 - 3. 添
2、 加 控 件 . - 4 - 4. 添加菜单项 . - 5 - 5控件的关联 . - 5 - 6. 打开工作空间 . - 6 - 8. 地图浏览操作 . - 7 - 9. 显示属性信息 . - 8 - 10. 地 图 量 算 . - 9 - 实验二:查询功能 . - 10 - 1、案例分析 . - 10 - 2、准备的数据 . - 10 - 3、主要使用的接口和操作 . - 11 - (1)查找 Missouri 河: . - 11 - (2)查询 Missouri 河穿过的州: . - 12 - (3)查询 Missouri 河 200 公里以内的县: . - 14 - (4) 查询 Sou
3、th Dakota州包含的州: . - 15 - (5) 关联查询 South Dakota州的人口数: . - 17 - 四、实验总结 . - 19 - 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 19 页- 3 - 一、实验背景近年来,随着社会信息化发展进程的不断推进,信息所具备的空间特性在众多社会活动公共行政决策和商业决策中发挥的作用越来越大。地理信息系统(GIS) 作为一种获取、 处理和分析空间信息的有效工具已经成为社会各行各业决策支持系统的重要组成部分。利用GIS 技术开发的以多媒体,网络化,自动化为特色的信息处理,信息管
4、理,指挥调度和决策支撑系统,已经在各领域发挥着重大作用。基于 c#程序语言的supermap objects 组件式开发可以针对用户的不同需求开发出人们实用的GIS 系统,所以二次开发具有非常重要的意义。通过 C#环境下 GIS 系统的开发,探索了GIS 组件开发的理论与方法,为GIS 应用系统的高性能开发提供了更多的理论依据从而利于改进和提高利用组件开发的GIS 应用系统的质量,扩展GIS 的应用领域。二、实验目的1、掌握利用SuperMap Objects + C# 来开发 GIS 系统。 C#是一种现代的面向对象语言。它使程序员快速便捷地创建基于Microsoft.NET平台的解决方案。
5、利用 C# + SuperMap Objects进行二次开发,熟悉对GIS 系统的二次开发。2、熟练应用SuperMap 来操作地图,并对数据进行处理。掌握SuperMap Objects 开发GIS 系统的接口,方法。3、通过课程设计进一步掌握了地理信息系统与应用课程的有关知识,掌握了GIS 系统程序设计与开发课程的相关知识,掌握了进行系统定义、系统总体设计方法、系统详细设计、空间数据库设计方法,掌握了利用开发语言和GIS 组件开发进行地理信息系统二次开发的能力,实现地理信息系统的基本功能和扩展功能,掌握面向对象进行程序设计的方法,并且可以建立空间数据库完成图形数据和属性数据的统一管理,将所
6、学的内容加以综合,并且对GIS 的二次开发有了整体的理解,真正实现从课本到实践的应用。三、实验内容及过程实验一:快速入门1. 新 建 项 目首先新建一个Windows 窗体应用程序名称为QuickStart。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 3 页,共 19 页- 4 - 2. 数 据 准 备请将本章范例项目QuickStart 中的 Data 文件夹复制到刚才新建的项目所在目录下。Data 文件夹共有3 个文件,分别为World.sdb、World.sdd、 World.smw,新建的项目目录和复制的数据目录3. 添 加 控 件(1
7、) 添加 SuperWorkspace 控件、 SuperMap 控件、 SuperLegend 控件、 SuperWorkspaceManager控件。 SuperWorkspace控件和 SuperMap 控件是 SuperMap Objects 组件式GIS 的两大核心控件。 SuperWorkspace 控件主要完成数据的组织、管理等。SuperMap 控件主要用于地图显示、图层的管理、地图基本操作等。在“选择工具箱项”对话框中切换到 “COM 组件”选项卡,在列表框中选择“SuperMap 控件”、 “SuperWorkspace 控件” 、 “SuperLegend 控件”和“ S
8、uperWorkspaceManager 控件”,添加成功后在工具箱中可以看到如图的效果。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 4 页,共 19 页- 5 - (3) SuperLegend控件和SuperWorkspaceManager 控件是辅助控件。其中 SuperWorkspace Manager 控件帮助二次开发人员统一管理SuperWorkspace 控件中的所有资源,使他们从繁琐的程序处理中解脱出来, 集中精力解决应用领域中的设计和实现问题; SuperLegend 控件会以树状结构显示与之相关联的地图窗口的图层信息。4.
9、添加菜单项5控件的关联SuperWorkspace控件负责数据的组织管理,而SuperMap 控件用于显示数据,因此我们首先需要将 SuperWorkspace 控件和 SuperMap 控件关联起来;另外,SuperWorkspaceManager 控件将显示工作空间的内容,因此这个控件需要和SuperWorkspace控件建立关联; SuperLegend控件用于显示当前地图窗口中打开的图层信息,因此我们还需要将SuperLegend 控件和SuperMap 控件进行关联。private void ConnectSuperMap() 精选学习资料 - - - - - - - - - 名师归
10、纳总结 - - - - - - -第 5 页,共 19 页- 6 - /将地图控件与工作空间控件进行关联 object objWSHandle = this.axSuperWorkspace1.CtlHandle; this.axSuperMap1.Connect(objWSHandle); /将工作空间管理器控件与工作空间控件进行关联 this.axSuperWkspManager1.Connect(objWSHandle); /将图例控件与地图控件进行关联 object objSMHandle = this.axSuperMap1.CtlHandle; axSuperLegend1.Con
11、nect(objSMHandle); ReleaseObjects(objWSHandle); ReleaseObjects(objSMHandle); 6. 打开工作空间双击“打开工作空间”菜单项,在ToolStripOpenWS_Click事件中添加如下代码。这段代码将实现打开用户选择的工作空间文件(*.smw 格式 )。strOpenPath = this.openFileDialog1.FileName; /打开对话框中选择的文件全路径,即将要打开的工作空间全路径this.ConnectSuperMap();/关联控件blnOpen = this.axSuperWorkspace1.O
12、pen(strOpenPath,);/打开工作空间7. 打开数据集数据源是由各种类型的数据集组成的数据集集合。一个数据源可包含一个或多个不同类型的数据集, 也可以同时存储矢量数据集和栅格数据集。数据源的存储格式由扩展名为SDB和 SDD 的两个文件组成。SDB 存储空间数据,SDD 为 Access 数据库,存储属性数据。数据集是由同种类型数据组成的数据集合,也就是一组数据对象的集合。SuperMap 支持十几种不同类型的数据集,如:点数据集、线数据集、面数据集、TIN 数据集、 GRID 数据集、 CAD 数据集、网络数据集、文本数据集等。首先为SuperWorkspaceManager控件
13、添加鼠标左键双击事件axSuperWkspManager1_LDbClick,添加的方法请参照前面介绍的添加MainForm_FormClosing精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 6 页,共 19 页- 7 - 事件的方法。在该事件中加入如下代码,实现双击打开数据集。另外,该段代码还实现了双击打开工作空间中已有地图的功能。string path = Application.StartupPath + .DataChina.smw; bool find = this.axSuperWorkspace1.Open(path); this
14、.axSuperMap1.OpenMap( 基础地图 ); this.axSuperMap1.Refresh(); this.axSuperWkspManager1.Refresh(); 数据集打开后, 将会在地图窗口中展现出来,而图例窗口用于显示当前地图窗口中的图层信息,因此当打开一个数据集后,需要刷新地图窗口,同时需要刷新图例窗口,这样在图例窗口中就可以立即看到这个新图层。8. 地图浏览操作在打开数据集或者打开地图之后,本节我们要完成一系列对地图的基本操作,包括对地图的放大、缩小、漫游、自由缩放、全幅显示以及单击选择。在 SuperMap Objects 中,通常与地图显示有关的操作都可以
15、通过设置SuperMap 控件的Action 属性完成。当Action 的值为零时,表示不进行任何操作。axSuperMap1.Action = SuperMapLib.seAction.scaSelect; /点选 ControlState(seAction.scaSelect); axSuperMap1.Action = SuperMapLib.seAction.scaZoomIn; /放大 ControlState(seAction.scaZoomIn); axSuperMap1.Action = SuperMapLib.seAction.scaZoomFree; /自 由 缩 放Con
16、trolState(seAction.scaZoomFree); axSuperMap1.Action = SuperMapLib.seAction.scaPan; /平移ControlState(seAction.scaPan); axSuperMap1.ViewEntire();/全幅显示精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 7 页,共 19 页- 8 - 9. 显示属性信息在 GIS 中,空间数据用于表示事物或现象的分布位置,而属性数据则用于说明事物和现象是什么。因而属性数据在地理信息系统中也是不可缺少的。 /双击对话框显示对象属性
17、 soSelection objSelection = this.axSuperMap1.selection; /获得选择集; soRecordset objRd=objSelection.ToRecordset(false); /将选择集转化为记录集; soFieldInfo objFieldinfo = null; if (objRd.RecordCount 0) /如果当前有选中的对象 string str = ; for (int i = 1; i 0 & nMeasureMode = 1) /当前绘制的折线最后一段的长度this.stadisvalue.Text = 长度 : + e
18、.dCurrentLength.ToString(); if (e.dTotalLength 0 & nMeasureMode = 1) /当前绘制的折线总长度this.statotledisvalue.Text = 总长度 : + e.dTotalLength.ToString(); 在绘制结束时执行的事件axSuperMap1_Tracked 中将鼠标状态设置为点选,并设置菜单的状态。private void axSuperMap1_Tracked(object sender, EventArgs e) mnuMeasureDistance.Checked = false; / 设置菜单状
19、态mnuMeasureArea.Checked = false; mnuMeasureAngle.Checked = false; axSuperMap1.Action = seAction.scaSelect;/ 设置当前鼠标状态为点选 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 9 页,共 19 页- 10 - 实验二:查询功能1、案例分析本功能实现通过使用一幅美国行政区划图实现查找Missouri河、查询 Missouri 河穿过的州、查询 Missouri河 200公里以内的县、查询South Dakota州包含的州和关联查询South
20、 Dakota 州的人口数的功能。本章是在上一功能的基础上开发的,且不需要添加特殊的控件,所以控件和上一功能的一样。2、准备的数据精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 10 页,共 19 页- 11 - 3、主要使用的接口和操作(1)查找 Missouri河:通过查询操作soDatasetVector.Query(), soRecordset.GetGeometry()获得查询到的对象soGeometry ,调用 soTrackingLayer.AddEvent()将查询到的对象添加到临时图层上显示。代码: private void To
21、olStripQueryMissouri_Click(object sender, EventArgs e) /查询 Missouri河,用到简单的SQL 查询,将查询结果放到临时图层上始终显示 soLayers objLayers = axSuperMap1.Layers; soLayer objLayer = objLayersRiversLus; if (objLayer = null) MessageBox.Show(请打开地图地图, 提示 ); ReleaseObjects(objLayers); return; soDataset objDataset = objLayer.Dat
22、aset; soDatasetVector objDatasetVector = (soDatasetVector)objDataset; soRecordset objRecordset = objDatasetVector.Query(RIVER_NAME = Missouri1, true, null, ); if (objRecordset != null) int n = objRecordset.RecordCount; soGeometry objGeo = objRecordset.GetGeometry(); soTrackingLayer objTrackingLayer
23、= axSuperMap1.TrackingLayer; soStyle objStyle = new soStyle(); objStyle.PenWidth = 10; objStyle.PenColor = (uint)ColorTranslator.ToOle(Color.Red); objTrackingLayer.AddEvent(objGeo, objStyle, Missouri1); axSuperMap1.Refresh(); objRecordset.Close(); ReleaseObjects(objStyle); ReleaseObjects(objTracking
24、Layer); ReleaseObjects(objGeo); ReleaseObjects(objRecordset); ReleaseObjects(objLayers); ReleaseObjects(objLayer); ReleaseObjects(objDataset); ReleaseObjects(objDatasetVector); 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 11 页,共 19 页- 12 - (2)查询 Missouri河穿过的州:先用 a的方法查出 Missouri 的几何对象,再调用空间查询soData
25、setVector .QueryEx(),并调用 soSelection .FromRecordset()将查询到的对象添加到选择集并高亮显示。代码: private void ToolStripQueryState_Click(object sender, EventArgs e) /查询 Missouri河穿过的州,空间查询 soLayers objLayers = axSuperMap1.Layers; soLayer objLayer = objLayersRiversLus; if (objLayer = null) MessageBox.Show(请打开地图 , 提示 ); Rel
26、easeObjects(objLayers); return; soDataset objDataset = objLayer.Dataset; soDatasetVector objDatasetVector = (soDatasetVector)objDataset; soRecordset objRecordset = objDatasetVector.Query(RIVER_NAME = Missouri1, true, null, );/首先查询出铜山县这个面对象 if (objRecordset != null) /如果查找出来了线再查找它所经过的面 soGeometry objG
27、eo = objRecordset.GetGeometry(); /获得 Missouri 河线对象 soLayer objLayerR = objLayersStatesRus; /获取州图层作为待查找图层 soDataset objDatasetR = objLayerR.Dataset; soDatasetVector objDatasetVectorR = 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 12 页,共 19 页- 13 - (soDatasetVector)objDatasetR; soRecordset objRecord
28、setR = objDatasetVectorR.QueryEx(objGeo, seSpatialQueryMode.scsLineCross, ); if (objRecordsetR != null) soSelection objSel = axSuperMap1.selection; objSel.FromRecordset(objRecordsetR);/把带有几何对象的记录集转化为选择集 objRecordsetR.Close(); ReleaseObjects(objSel); ReleaseObjects(objRecordsetR); objRecordset.Close(
29、); ReleaseObjects(objGeo); ReleaseObjects(objLayerR); ReleaseObjects(objDatasetR); ReleaseObjects(objDatasetVectorR); ReleaseObjects(objRecordset); ReleaseObjects(objLayers); ReleaseObjects(objLayer); ReleaseObjects(objDataset); ReleaseObjects(objDatasetVector); axSuperMap1.ViewEntire(); axSuperMap1
30、.Refresh(); 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 13 页,共 19 页- 14 - (3)查询 Missouri河 200 公里以内的县:先 用 a的 方 法 查 出 Missouri的 几 何 对 象 , 再 执 行 距 离 查 询soDatasetVector. QueryByDistance (),调用 soSelection .FromRecordset()将查询到的对象添加到选择集并高亮显示。代码: private void ToolStripQueryCounty_Click(object sender, Eve
31、ntArgs e) /查询 Missouri河200公里以内的县距离查询 soLayers objLayers = axSuperMap1.Layers; soLayer objLayer = objLayersRiversLus; if (objLayer = null) MessageBox.Show(请打开地图 , 提示 ); ReleaseObjects(objLayers); return; soDataset objDataset = objLayer.Dataset; soDatasetVector objDatasetVector = (soDatasetVector)objD
32、ataset; soRecordset objRecordset = objDatasetVector.Query(RIVER_NAME = Missouri1, true, null, );/首先查询出 Missouri河这个线对象 if (objRecordset != null) /如果查找出来了而再查找它所包含的线 soGeometry objGeo = objRecordset.GetGeometry(); /获得 Missouri河这个线对象 soLayer objLayerR = objLayersCountiesRus; /获取县图层作为待查找图层 soDataset objD
33、atasetR = objLayerR.Dataset; soDatasetVector objDatasetVectorR = (soDatasetVector)objDatasetR; soRecordset objRecordsetR = objDatasetVectorR.QueryByDistance(objGeo, 200000, ); if (objRecordsetR != null) soSelection objSel = axSuperMap1.selection; objSel.FromRecordset(objRecordsetR);/把带有几何对象的记录集转化为选择
34、集 axSuperMap1.EnsureVisibleRecordset(objRecordset);/使选中的记录能够最大化显示 axSuperMap1.Zoom(0.6); objRecordsetR.Close(); ReleaseObjects(objSel); ReleaseObjects(objRecordsetR); objRecordset.Close(); 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 14 页,共 19 页- 15 - ReleaseObjects(objGeo); ReleaseObjects(objLaye
35、rR); ReleaseObjects(objDatasetR); ReleaseObjects(objDatasetVectorR); ReleaseObjects(objRecordset); ReleaseObjects(objLayers); ReleaseObjects(objLayer); ReleaseObjects(objDataset); ReleaseObjects(objDatasetVector); axSuperMap1.Refresh(); (4) 查询 South Dakota州包含的州:实现的过程和步骤与“查询Missouri 河穿过的州”相同。代码: priv
36、ate void ToolStripQuerytown_Click(object sender, EventArgs e) /查询 South Dakota 州包含的镇空间查询 soLayers objLayers = axSuperMap1.Layers; soLayer objLayer = objLayersStatesRus; if (objLayer = null) MessageBox.Show(请打开地图 , 提示 ); Marshal.ReleaseComObject(objLayers); return; soDataset objDataset = objLayer.Dat
37、aset; soDatasetVector objDatasetVector = (soDatasetVector)objDataset; soRecordset objRecordset = objDatasetVector.Query(STATE_NAME = 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 15 页,共 19 页- 16 - South Dakota, true, null, );/首先查询出 South Dakota 这个面对象 if (objRecordset != null) /如果查找出来了而再查找它所包含的县 soG
38、eometry objGeo = objRecordset.GetGeometry(); /获得 South Dakota 这个面对象 soLayer objLayerL = objLayersCountiesRus; /获取铁路图层作为待查找图层 soDataset objDatasetL = objLayerL.Dataset; soDatasetVector objDatasetVectorL = (soDatasetVector)objDatasetL; soRecordset objRecordsetL = objDatasetVectorL.QueryEx(objGeo, seSp
39、atialQueryMode.scsContaining, ); if (objRecordsetL != null) soSelection objSel = axSuperMap1.selection; objSel.FromRecordset(objRecordsetL);/把带有几何对象的记录集转化为选择集 axSuperMap1.EnsureVisibleRecordset(objRecordset);/使选中的记录能够最大化显示 axSuperMap1.Zoom(0.5); String strName = ; String strTemp = ; while (!objRecor
40、dsetL.IsEOF() strTemp = objRecordsetL.GetFieldValue(COUNTY_NAM).ToString(); strName = strName + + strTemp; objRecordsetL.MoveNext(); strName = strName.Substring(5, strName.Length - 5); axSuperMap1.Refresh(); MessageBox.Show(strName, South Dakota州包含的镇 ); objRecordsetL.Close(); ReleaseObjects(objSel);
41、 ReleaseObjects(objRecordsetL); objRecordset.Close(); ReleaseObjects(objGeo); ReleaseObjects(objLayerL); ReleaseObjects(objDatasetL); ReleaseObjects(objDatasetVectorL); ReleaseObjects(objRecordset); ReleaseObjects(objLayers); 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 16 页,共 19 页- 17 - ReleaseOb
42、jects(objLayer); ReleaseObjects(objDataset); ReleaseObjects(objDatasetVector); (5) 关联查询 South Dakota州的人口数:新 建 soRelQueryTableInfo对 象 , 设 置 被 关 联 数 据 集 的 相 关 参 数 , 新 建soRelQueryTableInfos对象,添加一个或多个soRelQueryTableInfo对象,新建 soQueryDef对象,设置查询方式、查询字段、查询条件,设置关联表信息soRelQueryTableInfos对象,通过 soDatasetVector.
43、QueryDef()函数查询符合条件的记录,得到记录集,通过记录集soRecordset .GetFieldValue()获得关联查询到的值。代码: private void ToolStripQueryPopulation_Click(object sender, EventArgs e) /关联查询 South Dakota 州的人口数 soLayers objLayers = axSuperMap1.Layers; soLayer objLayer = objLayersStatesRus; if (objLayer = null) MessageBox.Show(请打开示范数据); R
44、eleaseObjects(objLayers); return; soDataset objDataset = objLayer.Dataset; soDatasetVector objDV = (soDatasetVector)objDataset; 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 17 页,共 19 页- 18 - soRelQueryTableInfos objRelTables = new soRelQueryTableInfos(); soRelQueryTableInfo objRelTable = new soRel
45、QueryTableInfo(); objRelTable.TableName = StatesRPop; /与之相连接的表 objRelTable.SearchCondition = StatesR.SmID = StatesRPop.SmID; /连接条件 objRelTable.JoinType = seJoinType.scjLeftJoin; /连接方式为左连接 objRelTables.Add(objRelTable); /向表集合中添加表 soQueryDef objQueryDef = new soQueryDef(); /定义查询信息 objQueryDef.QueryTyp
46、e = seQueryType.scqGeneral; /查询方式为普通查询 soStrings objFields = new soStrings(); /查询字段 objFields.Add(POP); objQueryDef.Fields = objFields; /查询结果字段集,默认为全部 objQueryDef.RelTables = objRelTables; /关联的表集合 objQueryDef.Filter = STATE_NAME = South Dakota; soRecordset objRecordset = objDV.Query2(objQueryDef); i
47、f (objRecordset != null) String strValue = objRecordset.GetFieldValue(POP).ToString(); strValue = South Dakota州人口总数 : + strValue; MessageBox.Show(strValue, South Dakota州人口总数 ); objRecordset.Close(); ReleaseObjects(objRecordset); ReleaseObjects(objLayer); ReleaseObjects(objDataset); ReleaseObjects(ob
48、jDV); ReleaseObjects(objRelTables); ReleaseObjects(objRelTable); ReleaseObjects(objQueryDef); ReleaseObjects(objFields); 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 18 页,共 19 页- 19 - 四、实验总结通过这次实验,我不但对组件式的GIS二次开发有了进一步的认识,也进一步熟悉了SuperMap Objects 与C#相结合的应用,提高了对c# 和 SuperMap Objects 的操作能力。以前的学习只是学习一些
49、单项功能,这些课让我学会了如何灵活的使用和组合这些功能,从而得到一个新的作品。这在课设过程中,我们体会到了地理信息系统在人们日常生活中发挥的广泛作用,增加了我们对自己所学专业的信心。同时, 也增加了我们的理论知识储备,锻炼并提高了实践能力,相信这一定会在今后的学习工作中为我们提供很大的帮助。在这次的实验我收获很多,总的来说有这么几个方面:1、这样的实验使我的实际操作能力有了很大的提升,2、在实验中更加锻炼了我的耐心和不怕苦的精神。3、在实验当中使我们在课堂中所学到的知识运用到了实际操作当中,因为我们很多人都存在眼高手低的情况,在课堂上看懂的程序,到自己实际动手编写的时候,无没有办法完成的。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 19 页,共 19 页