GIS设计07122868梁莹GIS实验报告.docx

上传人:b****8 文档编号:10461415 上传时间:2023-02-13 格式:DOCX 页数:35 大小:2.24MB
下载 相关 举报
GIS设计07122868梁莹GIS实验报告.docx_第1页
第1页 / 共35页
GIS设计07122868梁莹GIS实验报告.docx_第2页
第2页 / 共35页
GIS设计07122868梁莹GIS实验报告.docx_第3页
第3页 / 共35页
GIS设计07122868梁莹GIS实验报告.docx_第4页
第4页 / 共35页
GIS设计07122868梁莹GIS实验报告.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

GIS设计07122868梁莹GIS实验报告.docx

《GIS设计07122868梁莹GIS实验报告.docx》由会员分享,可在线阅读,更多相关《GIS设计07122868梁莹GIS实验报告.docx(35页珍藏版)》请在冰豆网上搜索。

GIS设计07122868梁莹GIS实验报告.docx

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、程序调试及修改。

因为编程经验不足,对于程序的调试也十分生疏,因此在实验中,程序出错却不会调试也是非常突出的问题。

但是这种能力是熟能生巧的过程,只有经过不断的学习和训练才能获得提高。

综上所述,在实验过程中遇到的问题都不容忽视,而且上面所列举仅仅是比较具有代表性的问题,还有很多小问题也克服,这里也就不列举。

问题固然存在,收获也还是不少的。

在本次实验过程中,加深了对课本理论知识的深入理解,为今后进行组件式编程提供了敲门砖,也为暑期实习打下了基础,并在发现问题、解决问题的过程中获得了个人能力的提高。

希望在今后的学习过程中,我能够不断努力,不断获得提升。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 党团工作 > 党团建设

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1