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、程序调试及修改。
因为编程经验不足,对于程序的调试也十分生疏,因此在实验中,程序出错却不会调试也是非常突出的问题。
但是这种能力是熟能生巧的过程,只有经过不断的学习和训练才能获得提高。
综上所述,在实验过程中遇到的问题都不容忽视,而且上面所列举仅仅是比较具有代表性的问题,还有很多小问题也克服,这里也就不列举。
问题固然存在,收获也还是不少的。
在本次实验过程中,加深了对课本理论知识的深入理解,为今后进行组件式编程提供了敲门砖,也为暑期实习打下了基础,并在发现问题、解决问题的过程中获得了个人能力的提高。
希望在今后的学习过程中,我能够不断努力,不断获得提升。