GIS设计07122868梁莹GIS实验报告.docx
- 文档编号:10461415
- 上传时间:2023-02-13
- 格式:DOCX
- 页数:35
- 大小:2.24MB
GIS设计07122868梁莹GIS实验报告.docx
《GIS设计07122868梁莹GIS实验报告.docx》由会员分享,可在线阅读,更多相关《GIS设计07122868梁莹GIS实验报告.docx(35页珍藏版)》请在冰豆网上搜索。
GIS设计07122868梁莹GIS实验报告
成绩
中国矿业大学
2012级1班课程实验报告
考试科目GIS设计与开发
考试时间2015年7月1日
学生姓名梁莹
学号07122868
任课教师张海荣
中国矿业大学环境与测绘学院
2015年6月
基于ArcObjects组件的常用GIS功能实现
【上机目的】
熟悉VisualStudio开发环境,掌握ArcGISEngine的组件式开发方式,掌握GIS基本功能的开发方法。
【上机内容】
以ArcObjectsfor.NET为开发包,用C#高级程序设计语言二次开发一个包含GIS基本操作的应用程序,实现地图文档的打开、保存、地图缩放/漫游,属性查询,空间查询,建立并访问地理空间数据库,TOC控件的右键菜单,添加shape数据,栅格数据等。
【上机要求】
1.完成代码的编写工作,通过对示例代码的学习,把这些分散的代码相互粘合起来,形成一个能实现常用GIS功能的应用程序。
学会VisualStudio2010代码常用调试方法,学会QueryInterface。
2.了解利用ComGIS进行应用型地理信息系统建设工作的基本思路。
3.独立实验,认真、按时完成实验报告。
代码编写过程中,同时思考以下问题:
(1)数据源如何被加载访问的?
ArcGIS数据组织方式是怎样的?
(2)ArcGISEngine开发中所涉及的面向对象知识中诸如类,继承,对象,接口等如何表达的?
【详细步骤】
1使用控件创建第一个桌面应用程序
1.1新建项目
在开始菜单中找到MicrosoftVisualStudio2010(简称VS),打开新建一个Windows窗体应用程序(文件--新建--项目--Windows窗体应用程序),见图1.1.1
图1.1.1新建工程
1.2添加容器和控件
拖动工具箱容器里的Panel控件至窗体(默认Name为panel1),右键属性调整Dock为Top;拖动分栏控件SplitContainer至panel1下面,调整Dock属性为Fill,并添加TOC,Map,Toolbar控件,见图1.2.1
图1.2.1构建模块
1.3添加地图文档
在Map处右击,修改其属性,添加地图文档,见图1.3.1
图1.3.1添加地图文档
1.4运行结果
经过调试,查看运行结果,见图1.4.1
图1.4.1运行结果
2地图打开与保存
2.1添加控件
(1)在MicrosoftVisualStudio2010(以下简称VS)中新建工程,设计窗体布局,添加控件:
AxMapControl即Map地图控件,AxTOCControl目录控件,AxToolbarControlGIS工具栏控件,见图2.1.1
图2.1.1添加控件
(2)关联控件,使窗体中添加的三个控件保持行为一致,即当地图发生变化的时候,其他控件相应发生改变,同时可以利用其他控件对地图进行操作,设置方法见图2.1.2
图2.1.2控件关联
2.2添加事件
(1)从工具箱中的菜单和工具栏把MenuStrip工具条拖到panel1里,新建文件菜单,在子菜单里新建“打开mxd文档”项,修改属性Name为OpenMxd,并建立OpenMxd的Click事件的委托处理函数,见图1.2.1
图2.2.1添加打开地图文档事件
(2)在文件菜单的子菜单里新建“保存mxd文档”项,修改Name为SaveMxd,并建立其Click时间的委托处理函数,见图2.2.2
图2.2.2添加保存地图文档事件
2.3设计代码
(1)打开代码窗口,为OpenMxd_Click函数添加代码,实现其打开地图文档的功能,代码如下:
privatevoidOpenMxd_Click(objectsender,EventArgse)
{
OpenFileDialogopenFileDialog=newOpenFileDialog();
openFileDialog.Title="打开mxd文档;
openFileDialog.Multiselect=false;
openFileDialog.Filter="*.mxd|*.mxd";
openFileDialog.RestoreDirectory=true;
if(openFileDialog.ShowDialog()==DialogResult.OK)
{
try
{
IMapDocumentmapDocument=newMapDocumentClass();
boolisPasswordProtected=mapDocument.get_IsPasswordProtected(openFileDialog.FileName);
if(!
isPasswordProtected)
{
axMapControl2.LoadMxFile(openFileDialog.FileName,0,string.Empty);
}
}
catch
{
MessageBox.Show("打开地图文档失败"+openFileDialog.FileName);
}
}
}
(2)为SaveMxd_Click函数添加代码,实现其打开地图文档的功能,代码如下:
privatevoidSaveMxd_Click(objectsender,EventArgse)
{
if(axMapControl2.Map.LayerCount<=0){}
else
{
IMxdContentsmxdContents=axMapControl2.MapasIMxdContents;
IMapDocumentmapDocument=newMapDocumentClass();
mapDocument.Open(axMapControl2.DocumentFilename,"");
IActiveViewactiveView=axMapControl2.MapasIActiveView;
mapDocument.ReplaceContents(mxdContents);
if(mapDocument.get_IsReadOnly(mapDocument.DocumentFilename)==true)
{
MessageBox.Show("本地图文档是只读的,不能保存!
");
}
else
{
try
{
mapDocument.Save(true,true);
MessageBox.Show("地图文档保存成功!
");
}
catch{}
}
}
}
1.4运行结果
(1)点击运行,修改错误列表中的各项问题,添加引用,并设置引用的嵌入互操作类型为False,得到运行初始界面,见图1.4.1
图2.4.1初始界面
(2)点击文件菜单,选择打开mxd文档就,选择需要打开的地图文档(见图2.4.2),尝试用工具栏中的工具对地图进行操作,见图2.4.3
图2.4.2文档打开窗口
图2.4.3打开地图文档
(3)将地图调整到想要的视图界面,单击保存mxd文档选项,见图1.4.4,则当下次打开地图文档时,显示的就是本次保存的地图视图。
图2.4.4保存地图文档
3缩放与漫游
3.1添加控件
在菜单栏添加常用功能菜单,在其子菜单中添加放大菜单,双击添加鼠标单击处理委托。
同理,添加缩小,漫游,全图菜单,见图2.1.1
图3.1.1添加菜单选项
3.2创建事件
添加axMapControl1的OnMouseDown事件处理函数,并在属性中分别为菜单选项创建Click委托事件函数,见图2.2.2
图3.2.2创建事件
3.3设计代码
(1)放大,其中Flag为地图OnMouse函数中调用参数
intflag;
privatevoid放大ToolStripMenuItem_Click(objectsender,EventArgse)
{
flag=1;
axMapControl1.MousePointer=esriControlsMousePointer.esriPointerZoomIn;
}
(2)缩小
privatevoid缩小ToolStripMenuItem_Click(objectsender,EventArgse)
{
flag=2;
axMapControl1.MousePointer=esriControlsMousePointer.esriPointerZoomOut;
}
(3)全局
privatevoid全局ToolStripMenuItem_Click(objectsender,EventArgse)
{
axMapControl1.Extent=axMapControl1.FullExtent;
}
(4)漫游
privatevoid漫游ToolStripMenuItem_Click(objectsender,EventArgse)
{
flag=3;
axMapControl1.MousePointer=esriControlsMousePointer.esriPointerPan;
}
(5)添加axMapControl1的OnMouseDown事件处理函数代码
privatevoidaxMapControl1_OnMouseDown(objectsender,
IMapControlEvents2_OnMouseDownEvente)
{IEnvelopeenvelope=null;
switch(flag)
{
case2:
{
envelope=axMapControl1.Extent;
envelope.Expand(2,2,true);
axMapControl1.Extent=envelope;
flag=0;
axMapControl1.MousePointer=esriControlsMousePointer.esriPointerDefault;
break;
}
case1:
{
/*envelope=axMapControl2.TrackRectangle();*/
envelope=axMapControl1.Extent;
envelope.Expand(0.5,0.5,true);
axMapControl1.Extent=envelope;
flag=0;
axMapControl1.MousePointer=esriControlsMousePointer.esriPointerDefault;
break;
}
case3:
{
envelope=axMapControl1.Extent;
axMapControl1.Pan();
flag=0;
axMapControl1.MousePointer=esriControlsMousePointer.esriPointerDefault;
break;
}
3.4运行结果
运行程序,打开地图图层(图3.4.1),对地图进行常规功能的操作,如放大(见图3.4.2),缩小(图3.4.3),漫游(图3.4.4),全局(图3.4.5)
图3.4.1打开地图
图3.4.2放大
图3.4.3缩小
图3.4.4漫游
图3.4.5全局
4属性查询
4.1添加控件
(1)在菜单栏添加属性查询菜单,见图4.1.1
图4.1.1
(2)在工程中新添加窗口,用来显示属性列表,并在窗口中插入工具箱的Data项添加datagridview,设置duck属性为fill,见图4.1.2
图4.1.2新增属性查询结果窗口
4.2添加事件
右击属性查询,打开属性窗口,为属性查询添加Click事件,见图4.2.1
图4.2.1
4.3设计代码
(1)在新增属性查询结果窗口的代码中新建类,并设置数据加载函数:
publicpartialclassForm2:
Form
{privateDataTabledataTable;
publicForm2(DataTabledataTable)
{this.dataTable=dataTable;
InitializeComponent();}
privatevoidForm2_Load(objectsender,EventArgse)
{if(dataTable!
=null)
{
dataGridView1.DataSource=dataTable;
}
}
}
(2)在FORM1窗体中,为属性查询的Click委托事件添加函数,使其实现单击属性查询,即能打开属性查询结果,并能显示地图中指定图层的属性表。
privatevoid属性查询ToolStripMenuItem_Click(objectsender,EventArgse)
{
try
{
ILayerlayer=axMapControl1.get_Layer(0);
IFeatureLayerfeatureLayer=layerasFeatureLayer;
IFeatureClassfeatureClass=featureLayer.FeatureClass;
ILayerFieldslayerFields=featureLayerasILayerFields;
DataSetdataSet=newDataSet("dsTest");
DataTabledataTable=newDataTable(featureLayer.Name);//创洹?
建¨列
DataColumndataColumn=null;
for(inti=0;i { dataColumn=newDataColumn(layerFields.get_Field(i).Name); dataTable.Columns.Add(dataColumn); dataColumn=null; } IFeaturefeature=null; IQueryFilterqueryFilter=newQueryFilterClass(); IFeatureCursorfeatureCursor; queryFilter.WhereClause="POP_CLASS="+"'5,000,000andgreater'"; featureCursor=featureClass.Search(queryFilter,true); feature=featureCursor.NextFeature(); while(feature! =null) { DataRowdataRow=dataTable.NewRow(); for(intj=0;j { if(layerFields.FindField(featureClass.ShapeFieldName)==j) { dataRow[j]=featureClass.ShapeType.ToString(); } else { dataRow[j]=feature.get_Value(j); } } dataTable.Rows.Add(dataRow); feature=featureCursor.NextFeature(); } if(dataTable.Rows.Count>0) { Form2attributeQueryResult=newForm2(dataTable); attributeQueryResult.ShowDialog(); } } catch { } } 4.4运行结果 点击调试运行,打开地图,点击属性查询,得到属性查询结果,见图4.4.1 图4.4.1属性查询结果 5空间查询 5.1添加菜单 添加菜单“空间查询”,并下设子菜单“点选”、“矩形选择”,见图5.1.1 图5.1.1添加菜单 5.2添加事件 (1)右击点选,修改Name,并为其添加Click事件,见图5.2.1 图5.2.1 (2)用与1同样的方法为“矩形选择”修改属性,添加事件。 5.3设计代码 (1)点选,为点选添加flag值,并在axMapControl1的OnMouseDown事件处理函数中添加事件触发代码。 (2)矩形选择 5.4运行结果 (1)运行工程,加载地图,选择点选选项,选中需要选择的地图区域,见图5.4.1 图5.4.1点选 (2)单击矩形选择,选中区域,见图5.4.2 图5.4.2矩形选择 6建立地理空间数据库 6.1创建个人数据库 (1)打开ArcCatalog新建文件夹连接到要创建PersonalGeodatabase的文件夹下面,新建PersonalGeodatabase,并重命名。 件图6.1.1 图6.1.1新建个人数据库 (2)在个人数据库中导入shape数据,建立好个人数据库,见图6.1.2 图6.1.2 6.2添加事件 在文件菜单下添加“打开个人数据库”子菜单,并打开其属性,添加Click事件,见图6.2.1和图6.2.2 图6.2.1新建子菜单 图6.2.2创建Click事件 6.3设计代码 打开“打开个人数据库”的Click函数所在位置,添加代码,实现在文档中添加个人数据库的功能。 图6.3.1添加个人数据库 6.4运行结果 点击运行程序,打开地图,单击“添加个人数据库”选择个人数据库文件,见图6.4.1 图6.4.1打开个人空间数据库 但是由于不明原因的异常,经调试无果,还是无法成功加载数据库,异常情况见图6.4.2 图6.4.2加载异常 相同代码在同学工程中成功运行,现展示下运行结果,见图6.4.3 图6.4.3添加个人数据库 7添加shape数据,栅格数据 7.1添加菜单 在菜单中添加子菜单“打开shp数据”和“添加影像数据”,见图7.1.1 图7.1.1添加菜单 7.2设计“添加shp数据” 双击“添加shp数据”,为其创建Click触发事件函数,实现添加.shp格式文件的功能,代码见图7.2.1 图7.2.1添加shp数据 7.3设计“添加影像数据” 双击“添加影像数据”,为其创建Click触发事件函数,实现添加影像数据的功能,代码见7.3.1 图7.3.1添加影像数据 7.4运行结果 (1)运行程序,解决错误列表中关于引用数据集的问题,选择需要添加的文件,见图7.4.1,并查看结果,见图7.4.2 图7.4.1选择添加文件 图7.4.2添加文件结果 (2)单击“添加影像数据”,选择想要添加的“CUMT.png”文件,查看添加结果,见图7.4.3 图7.4.3添加影像数据 8鹰眼图 8.1添加控件 在工程中添加用来显示鹰眼图的MapControl控件,见图8.1.1 图8.1.1添加控件 8.2设计代码 新建鹰眼图添加函数,为其添加代码,实现当加载地图使,鹰眼图窗口能相应显示全图,代码见图8.2.1 图8.2.1配置鹰眼图 8.3运行结果 打开地图文档,观察运行结果,见图8.3.1 图8.3.1鹰眼图 【实习总结】 本次课程实习算是第一次真正意义上开始进行GIS组件式设计,摆脱了小黑窗,进行可视化设计还是比较方便的。 但虽然有指导书,过程中仍旧感觉比较曲折,遇到很多问题: 1、数据集的引用及调用。 在刚开始进行设计的时候,调试中遇到的最多的问题莫过于敲好了代码,但是代码缺少引用数据集,无法实现其功能。 此类问题的主要原因还是我对结构和数据集的引用不够熟悉,不清楚每种功能的实现需要怎样的配置环境。 不过随着实验的进行,对于此类问题还是能够较好的解决了。 但是,不可否认,对于接口的不了解,在今后的开发设计过程中将会产生很大问题。 现在有指导书和老师提供的代码都尚且不能很顺利完成,如果自己进行,恐怕将更加困难。 因此,需要我们在今后的学习过程中不断提高和改进。 2、对编程语言的不熟悉。 虽然之前学习过C语言,但是和本次实验所用的面向对象语言C#还是有很大区别,不论是编程语言规则还是面向对象的类的继承、关联、创建等方面掌握不足,导致在实验过程中犯很多错误。 这也警示我需要进行自我学习,不断提高个人编程能力,不然就无法适应专业需要。 3、程序调试及修改。 因为编程经验不足,对于程序的调试也十分生疏,因此在实验中,程序出错却不会调试也是非常突出的问题。 但是这种能力是熟能生巧的过程,只有经过不断的学习和训练才能获得提高。 综上所述,在实验过程中遇到的问题都不容忽视,而且上面所列举仅仅是比较具有代表性的问题,还有很多小问题也克服,这里也就不列举。 问题固然存在,收获也还是不少的。 在本次实验过程中,加深了对课本理论知识的深入理解,为今后进行组件式编程提供了敲门砖,也为暑期实习打下了基础,并在发现问题、解决问题的过程中获得了个人能力的提高。 希望在今后的学习过程中,我能够不断努力,不断获得提升。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- GIS 设计 07122868 梁莹 实验 报告