gis软件设计实验报告完整版.docx
《gis软件设计实验报告完整版.docx》由会员分享,可在线阅读,更多相关《gis软件设计实验报告完整版.docx(95页珍藏版)》请在冰点文库上搜索。
gis软件设计实验报告完整版
地理与生物信息学院
2012/2013学年第一学期
GIS软件设计
实验报告
课程名称:
GIS软件设计
实验名称:
小型GIS软件系统的设计与开发
班级学号B********B********
学生姓名冶福荣郑正中
指导教师原立峰
日期:
2012年9月
一、软件设计题目
基于ArcGISEngine及C#编程语言构建一个小型GIS平台系统。
二、设计内容
软件为一个小型的GIS平台,主要包括:
空间数据存取模块、地图浏览模块、地图编辑模块、空间查询模块、空间分析模块、地图修饰模块。
(1)空间数据存取模块
该模块实现对地图数据的新建、加载、保存、另存和打印输出对于地图的硬拷贝输出实现所见即所得效果。
(2)地图浏览模块
该模块主要包括地图工具、滚动条,状态条、鹰眼图、内容视图等。
其中地图工具可以实现放大、缩小、中心放大、中心缩小、全景视图、漫游、要素选择和取消、空间查询等具体功能。
(3)地图数据编辑模块
该模块能够实现新建图层、添加图层、删除所有图层、开始编辑和结束编辑的操作。
编辑可以对图层进行创建新特征、修改任务、移动特征和设置捕捉环境等操作。
(4)空间查询模块
该模块实现的是属性查询。
(5)空间分析模块
该模块可以进行缓冲区分析。
三、设计要求
使用ArcGISEngine和C#、VB.net等编程语言完成任务。
四、实现过程
1.空间数据存储模块
图1.文件菜单
图2.工具栏
A.新建地图
1、创建同步地图类ControlsSynchronizer
2、新建新的地图对象IMapmap=newmap();同时更新地图文档
B.加载shapefile文件和mxd文档
1、新建打开文档对话框,设置文件类型为”(*.shp)|*.shp”
2、将对话框获得的shapefile文档的地址返回,检查文档是否存在,若存在则将文档加载,并将文档中的参数添加至featureclass和featurelayer中;若不存在,则错误提示。
3、更新mapcontrol和鹰眼中的地图。
C.保存地图文档
使用ESRI提供的接口函数IMapDocument类中的voidSave(boolbUseRelativePaths,boolbCreateThumnbail);函数。
D.另存地图文档
首先需用户确认是否需要保存当前的地图文档,之后调用类ControlsSaveAsDocCommandClass(),进行地图另存为操作。
E.打印地图文档
图3.打印窗体界面
创建打印窗体类:
PrintPageLayoutForm,将地图文档传递到窗体中预览,选择打印机、纸张大小、打印方向等,将地图打印出来。
F.地图输出为图片
图4.地图输出为图片界面
创建地图输出窗体类:
ExportMapForm,选择输出的路径、分辨率、图片尺寸、图片类型,并将地图输出为图片。
2.地图浏览模块
A.地图工具
实现工具栏中的控件,比如加载地图文件、添加地图图层、地图显示、漫游功能、中心缩放、放大缩小等功能。
分别创建GISBasicCommand类:
OpenNewMapDocument、ZoomIn、ZoomOut、FixedZoomIn、FixedZoomOut、FullExtent、GoBackToPreviousExtent、GoToNextExtent、ReDoDraw、UnDoDraw。
在工具栏,将这些功能添加上,单击实现。
具体代码如下:
///
///新建地图文档
///
///
///
privatevoidOpenNewDocument_Click(objectsender,EventArgse)
{
ICommandcommand=newOpenNewMapDocument(m_controlsSynchronizer);
ITooltool=commandasITool;
command.OnCreate(m_mapControl.Object);
command.OnClick();
}
///
///加载数据
///
///
///
privatevoidAddData_Click(objectsender,EventArgse)
{
ICommandcommand=newControlsAddDataCommandClass();
command.OnCreate(axMapControl1.Object);
command.OnClick();
}
///
///全屏命令
///
///
///
privatevoidFullExtent_Click(objectsender,EventArgse)
{
ICommandcommand=newControlsMapFullExtentCommandClass();
command.OnCreate(m_mapControl.Object);
command.OnClick();
}
///
///漫游命令
///
///
///
privatevoidPanTool_Click(objectsender,EventArgse)
{
ICommandcommand=newControlsMapPanToolClass();
ITooltool=commandasITool;
command.OnCreate(m_mapControl.Object);
axMapControl1.CurrentTool=tool;
axPageLayoutControl1.CurrentTool=tool;
}
///
///撤销命令
///
///
///
privatevoidGoBackToPreviousExtent_Click(objectsender,EventArgse)
{
ICommandcommand=newGoBackToPreviousExtent();
command.OnCreate(m_mapControl.Object);
command.OnClick();
}
///
///前进命令
///
///
///
privatevoidGoToNextExtent_Click(objectsender,EventArgse)
{
ICommandcommand=newGoToNextExtent();
command.OnCreate(m_mapControl.Object);
command.OnClick();
}
///
///放大命令
///
///
///
privatevoidZoomIn_Click(objectsender,EventArgse)
{
ICommandcommand=newZoomIn();
command.OnCreate(m_mapControl.Object);
ITooltool=commandasITool;
axMapControl1.CurrentTool=tool;
}
///
///缩小命令
///
///
///
privatevoidZoomOut_Click(objectsender,EventArgse)
{
ICommandcommand=newZoomOut();
command.OnCreate(m_mapControl.Object);
ITooltool=commandasITool;
axMapControl1.CurrentTool=tool;
}
///
///中心缩小命令
///
///
///
privatevoidFixedZoomIn_Click(objectsender,EventArgse)
{
ICommandcommand=newFixedZoomIn();
command.OnCreate(m_mapControl.Object);
command.OnClick();
}
///
///中心放大命令
///
///
///
privatevoidFixedZoomOut_Click(objectsender,EventArgse)
{
ICommandcommand=newFixedZoomOut();
command.OnCreate(m_mapControl.Object);
command.OnClick();
}
B.状态栏
状态条显示当前鼠标的坐标位置,当前比例尺,还有控件名称以及目前地图的编辑状态。
坐标显示的源代码如下:
///
///MapControl鼠标移动响应函数
///
///
///
privatevoidaxMapControl1_OnMouseMove(objectsender,IMapControlEvents2_OnMouseMoveEvente)
{
//显示当前比例尺
ScaleLabel.Text="比例尺1:
"+((long)this.axMapControl1.MapScale).ToString();
//显示当前坐标
CoordinateLabel.Text="当前坐标X="+e.mapX.ToString()+"Y="+e.mapY.ToString()
+""+this.axMapControl1.MapUnits.ToString().Substring(4);
}
C.鹰眼图
鹰眼和主地图的互动,主要体现在两个方面:
一是主地图的地图改变了,则鹰眼里的矩形框要移动到对应的位置,以指示当前地图在整个地图中的位置;二是鹰眼的矩形框移动了,则主地图中显示的地图要移动到相应的位置。
在主地图的OnAfterDrawMapControl事件中,根据当前地图的大小,改变鹰眼中矩形框的大小。
鹰眼实现过程:
1、创建函数,当主地图中的地图文档被替换时,将主地图中的图层拷贝并更新到鹰眼地图中的文档。
图层拷贝函数如下:
///
///图层拷贝函数
///
///
///
privateILayerLayerClone(ILayerpLayer)
{
IFeatureLayerpFeatureLayer=newFeatureLayerClass();
pFeatureLayer.FeatureClass=(pLayerasIFeatureLayer).FeatureClass;
pFeatureLayer.Name=pLayer.Name;
pFeatureLayer.DisplayField=(pLayerasIFeatureLayer).DisplayField;
pFeatureLayer.MaximumScale=pLayer.MaximumScale;
pFeatureLayer.MinimumScale=pLayer.MinimumScale;
(pFeatureLayerasIGeoFeatureLayer).Renderer=(pLayerasIGeoFeatureLayer).Renderer;
(pFeatureLayerasIGeoFeatureLayer).AnnotationProperties=(pLayerasIGeoFeatureLayer).AnnotationProperties;
(pFeatureLayerasIGeoFeatureLayer).DisplayAnnotation=(pLayerasIGeoFeatureLayer).DisplayAnnotation;
#region清除鹰眼中的标注
IAnnotateLayerPropertiesCollectionpAnnotateLayerPropertiesCollection=(pFeatureLayerasIGeoFeatureLayer).AnnotationProperties;
if(pAnnotateLayerPropertiesCollection.Count>0)
{
pAnnotateLayerPropertiesCollection.Clear();
}
#endregion
returnpFeatureLayerasILayer;
}
图层拷贝函数主要避免在加载具有文本标记的地图文档时因地图文档共用时的错误,通过图层拷贝,并清楚鹰眼图层中的标注,即可避免这个问题。
2、鼠标事件的响应
鼠标事件主要有鼠标的移动、单击。
当鼠标单机并移动时,绘制鹰眼框,鼠标的移动与主地图控件的地图进行互动。
3.地图数据编辑模块
A.添加图层
添加图层代码如下:
///
///加载shapefile数据命令
///
///
///
privatevoidLoadShapFileToolStripMenuItem_Click(objectsender,EventArgse)
{
AddShapefile();
}
//添加Shapefile文件函数
publicvoidAddShapefile()
{
ESRI.ArcGIS.Carto.IActiveViewactiveView=axMapControl1.ActiveView;
ESRI.ArcGIS.Carto.IActiveViewactiveView1=axMapControl2.ActiveView;
if(activeView==null)
{
return;
}
if(activeView1==null)
{
return;
}
System.Windows.Forms.OpenFileDialogopenFileDialog=newSystem.Windows.Forms.OpenFileDialog();
openFileDialog.Filter="Shapefiles(*.shp)|*.shp";
if(openFileDialog.ShowDialog()==DialogResult.OK)
{
stringshapefileLocation=openFileDialog.FileName;
stringpathFile=shapefileLocation;
if(shapefileLocation!
="")
{
IWorkspaceFactoryworkspaceFactory=newShapefileWorkspaceFactoryClass();
IFeatureWorkspacefeatureWorkspace=(IFeatureWorkspace)workspaceFactory.OpenFromFile(System.IO.Path.GetDirectoryName(shapefileLocation),0);
IFeatureClassfeatureClass=featureWorkspace.OpenFeatureClass(System.IO.Path.GetFileNameWithoutExtension(shapefileLocation));
IFeatureLayerfeatureLayer=newFeatureLayerClass();
featureLayer.FeatureClass=featureClass;
featureLayer.Name=featureClass.AliasName;
featureLayer.Visible=true;
//添加到主窗口中的代码
activeView.FocusMap.AddLayer(featureLayer);
activeView.Extent=activeView.FullExtent;
activeView.PartialRefresh(esriViewDrawPhase.esriViewGeography,null,null);
//添加到鹰眼视图窗口中的代码
activeView1.FocusMap.AddLayer(featureLayer);
activeView1.Extent=activeView1.FullExtent;
activeView1.PartialRefresh(esriViewDrawPhase.esriViewGeography,null,null);
}
else
{
MessageBox.Show("操作出错啦!
");
}
}
}
B.删除所有图层
删除所有图层这个功能目前只能实现把图层隐藏,达到完全删除的功能还未实现。
C.编辑栏实现
地图编辑栏主要实现的是地图要素的描绘、移动、删除、修改等。
实现的思路是调用ESRI提供的接口。
在界面上添加两个ToolBarControl,分别在其中命名为axEditToolBar和axExtraToolbar。
添加命令至ToolBar中:
代码如下:
//axToolbarControl1.SetBuddyControl(axMapControl1);
axEditToolBar.SetBuddyControl(axMapControl1);
axExtraToolbar.SetBuddyControl(axMapControl1);
//setthetoolbar
//ExtraEditorToolbar
axExtraToolbar.AddItem("esriControls.ControlsUndoCommand",0,-1,true,0,esriCommandStyles.esriCommandStyleIconOnly);
axExtraToolbar.AddItem("esriControls.ControlsRedoCommand",0,-1,false,0,esriCommandStyles.esriCommandStyleIconOnly);
axExtraToolbar.AddItem("esriControls.ControlsEditingCutCommand",0,-1,true,0,esriCommandStyles.esriCommandStyleIconOnly);
axExtraToolbar.AddItem("esriControls.ControlsEditingPasteCommand",0,-1,false,0,esriCommandStyles.esriCommandStyleIconOnly);
axExtraToolbar.AddItem("esriControls.ControlsEditingCopyCommand",0,-1,false,0,esriCommandStyles.esriCommandStyleIconOnly);
axExtraToolbar.AddItem("esriControls.ControlsEditingClearCommand",0,-1,false,0,esriCommandStyles.esriCommandStyleIconOnly);
//EditorToolbar
axEditToolBar.AddItem("esriControls.ControlsEditingEditorMenu",0,-1,false,0,esriCommandStyles.esriCommandStyleIconOnly);
//command
axEditToolBar.AddItem("EditorCommands.GeneralizeCmd",0,-1,false,0,esriCommandStyles.esriCo