《GIS程序设计实习》实习指导书v20.docx
《《GIS程序设计实习》实习指导书v20.docx》由会员分享,可在线阅读,更多相关《《GIS程序设计实习》实习指导书v20.docx(21页珍藏版)》请在冰豆网上搜索。
《GIS程序设计实习》实习指导书v20
《GIS程序设计实习》实习指导书
一、实习目的
通过GIS程序设计实习,使学生了解需求分析、项目管理方案设计、系统总体设计以及系统详细设计、系统实施、运行和维护等阶段要完成的具体工作;掌握在C#和ArcEngine环境下构建应用型地理信息系统的方法。
二、实习的内容与要求
熟悉开发环境:
VisualStudio2010;C#;ArcEngine10.1
功能需求分析
基于组件技术开发应用型地理信息系统
组件式技术已成为当今软件技术的潮流之一。
组件式GIS软件的基本思想是把GIS各大功能模块划分为几个控件。
各个GIS控件之间,以及GIS控件与其他非GIS控件之间,可以方便地通过可视化的软件开发工具集成起来,形成最终的GIS应用。
重点完成的工作包括:
1)建立ArcGISEngine应用程序框架;2)实现对矢量数据(ShapeFile格式)的访问;3)实现采用唯一值(UniqueValues)的方式实现对面状矢量数据进行渲染(Render)。
三、时间安排:
1、实习动员:
介绍本次实习的内容和安排,布置任务。
(1天)
2、以上2项实习内容。
(3天)
3、编写实习报告,上交成果。
(2天)
四、成绩评定
1、按学生的实习态度占10%。
2、独立动手能力20%。
3、实习成果70%。
五、实习报告内容:
1、实习目的
2、实习内容
3、实习步骤(原理,方法,如何操作)
4、实习结果
5、实习感受
实习一:
初识ArcGISEngine开发环境
1、新建Windows窗体应用程序
启动VS2008,选择“文件|新建|项目|Windos窗体应用程序”,在项目类型中选择VisualC#,再选择Windows应用程序模板,输入名称“MyMap”,点击确定。
2、查看ArcGISWindowsForms控件
3、添加地图控件
添加完这几个控件后,VS会自动为我们添加一些引用,这些应用如下,注意Version这个类库是ArcGISEngine新增加的,而且必不可少。
4、设置相应的属性
右击ToolbarControl控件,选择“属性|Items(选择工具)|AddCommands”,选择常用工具。
5、控件绑定:
设置控件之间的关联
通过以上步骤添加的控件还只是单独存在,而我们的程序需要各控件间协同工作,因此要进行控件绑定。
分别右击ToolbarControl、TOCControl控件,将Buddy设置为axMapControl1。
6、编译运行
按F5即可编译运行程序,至此桌面GIS应用程序框架基本框架已经搭建好了,你可以通过工具条的工具打开地图文档,浏览地图了。
实习二:
建立ArcGISEngine应用程序框架
2.1地图浏览
1、新建项目
启动VS2008,选择“文件|新建|项目|Windos窗体应用程序”,在项目类型中选择VisualC#,再选择Windows应用程序模板,输入名称“MyMapFrame”,点击确定。
在解决方案管理器中将“Form1.cs”重命名为“MyMap.cs”,在设计视图中,选中窗体,将其属性中的“Text”改为“MyArcGIS”。
2、添加控件
选择工具箱中的“菜单和工具栏|StatusStrip(状态栏)”,将其拖入到窗体。
选择工具箱中的“ArcGISWindowsForms”节,将“ToolbarControl”控件拖入窗体,并将其属性中的Dock设置为Top。
选择工具箱中的“容器|SplitContainer(容器)”拖入窗体,并将其属性中的Dock设置为Fill。
将TabControl控件拖入Panel1,将Alignment属性设置为Bottom,Dock属性设置为Fill。
点击TabPages属性右边的按钮,弹出TabPage集合编辑器,将tabPage1的Name设置为“Layer”,Text设置为“图层”;将tabPage2的Name设置为“Property”,Text设置为“属性”。
如下所示:
选择“图层”选项卡,拖入TOCControl控件,设置Dock属性为Fill。
选择“属性”选项卡,拖入所有Windows窗体|PropertyGrid控件,设置Dock属性为Fill。
拖入TabControl控件到Panel2,设置Dock属性为Fill。
并用上述类似的方法,将两个选项卡的Name和Text分别设置为:
(Map、地图)和(Layout,制版)。
选择“地图”选项卡,拖入MapControl控件,设置Dock属性为Fill。
选择“制版”选项卡,拖入PageLayoutControl控件,设置Dock属性为Fill。
最后将LicenseControl控件拖入到窗体的任意地方。
按F5编译运行,可以看到布局好的程序界面。
3、控件绑定
通过以上步骤添加的控件还只是单独存在,而我们的程序需要各控件间协同工作,因此要进行控件绑定。
分别右击ToolbarControl、TOCControl控件,将Buddy设置为axMapControl1,如下图所示。
4、添加工具
工具条中还没有任何工具,添加的方法也很简单。
右击ToolbarControl,选择“属性|Items”,点击Add,选择Commands选项卡中的Generic,双击Open、SaveAs、Redo、Undo即可将相应工具添加到工具条。
常见的工具有:
MapNavigation中的导航工具,MapInquiry中的查询工具,FeatureSelection中的选择工具,你可以根据需要酌情添加工具。
5、右键点击LicenseControl,点击属性菜单.
浏览弹出的对话框,其中ArcGISEngine已经选中,如果需要其它扩展模块的许可,可以在右侧选中对应的复选框,点击确定按钮。
5、编译运行
按F5即可编译运行程序,至此桌面GIS应用程序框架基本框架已经搭建好了,你可以通过工具条的工具打开地图文档,浏览地图了。
2.2添加shp数据
刚刚在2.1部分在没有写代码的情况下,我们生成了一个地图浏览小程序。
下面我们来使用代码的方式添加数据。
1、添加菜单控件并设置菜单属性
在VS2010的工具箱中,展开菜单和工具栏,双击MenuStrip控件,这样就在窗体上添加了一个菜单控件;同样双击添加openFileDialog控件,置于窗体任何位置.
在菜单上点击,输入“添加SHP数据”作为菜单的标题。
2、代码处理
2.1选中“添加SHP数据”菜单,在属性框中点击事件按钮,在事件列表中双击Click事件;或者双击“添加SHP数据”菜单.自动生成的事件处理方法如下图所示,我们将在方法内输入处理代码。
下面开始使用ArcGISEngine进行编码,首先需要添加ArcGIS的引用,在解决方案管理器中右键点击“添加引用”。
在MyMap.cs源代码文件中,在源代码的最顶部,输入如下代码,导入命名空间。
usingESRI.ArcGIS.Carto;
usingESRI.ArcGIS.Controls;
usingESRI.ArcGIS.esriSystem;
usingESRI.ArcGIS.Display;
usingESRI.ArcGIS.Geometry;
usingESRI.ArcGIS.SystemUI;
usingESRI.ArcGIS.DataSourcesRaster;
///////////////为SHP数据功能增加的类库
usingESRI.ArcGIS.DataSourcesFile;
usingESRI.ArcGIS.Geodatabase;
usingSystem.IO;
在菜单的Click事件处理方法中添加如下代码。
有多种方法添加shapefile文件到地图控件中,本示例的步骤如下:
1.创建工作空间工厂。
2.打开shapefile工作空间。
3.打开要素类。
4.创建要素图层。
5.关联图层和要素类。
6.添加到地图控件中。
示例代码:
openFileDialog1.Filter="shapefile文件(*.shp)|*.shp";
openFileDialog1.Multiselect=false;
DialogResultpDialogResult=openFileDialog1.ShowDialog();
if(pDialogResult!
=DialogResult.OK)
return;
stringpPath=openFileDialog1.FileName;
stringpFolder=System.IO.Path.GetDirectoryName(pPath);
stringpFileName=System.IO.Path.GetFileName(pPath);
IWorkspaceFactorypWorkspaceFactory=newShapefileWorkspaceFactory();
IWorkspacepWorkspace=pWorkspaceFactory.OpenFromFile(pFolder,0);
IFeatureWorkspacepFeatureWorkspace=pWorkspaceasIFeatureWorkspace;
IFeatureClasspFC=pFeatureWorkspace.OpenFeatureClass(pFileName);
IFeatureLayerpFLayer=newFeatureLayerClass();
pFLayer.FeatureClass=pFC;
pFLayer.Name=pFC.AliasName;
ILayerpLayer=pFLayerasILayer;
IMappMap=axMapControl1.Map;
pMap.AddLayer(pLayer);
axMapControl1.ActiveView.Refresh();
3、在键盘上按F5键,运行调试。
点击“添加SHP数据”菜单,在弹出的对话框中,选中任意一个shp文件,点击确定,即可把shp文件加载到地图控件中。
实习三:
矢量要素符号化
3.1搭建符号化功能界面
在之前创建的MenuStrip上,新建“地图渲染”菜单,并新增“简单渲染”和“唯一值渲染”两个菜单项,如下图所示。
3.2代码处理
3.1选中“简单渲染”菜单,在属性框中点击事件按钮,在事件列表中双击Click事件;或者双击“简单渲染”菜单,自动生成的事件处理方法如下图所示,我们将在方法内输入处理代码。
重复相同的操作,为“唯一值渲染”菜单增加事件处理函数。
在菜单“简单渲染”的Click事件处理方法中添加如下代码。
privatevoidDefineSimpleRender(IFeatureLayerpFeatureLayer,stringsFieldName)
{
//设置用于渲染的颜色
IRgbColorpColor=newRgbColorClass();
pColor.Red=255;
pColor.Blue=0;
pColor.Green=0;
//设置用于渲染的符号的基本属性(面状符号)
ISimpleFillSymbolpSFSBase=newSimpleFillSymbolClass();
pSFSBase.Style=esriSimpleFillStyle.esriSFSSolid;//设置填充方式
pSFSBase.Outline.Width=0.4;//设置边框的宽度
pSFSBase.Color=pColorasIColor;
//设置简单渲染的相关属性
ISimpleRendererpSR=newSimpleRendererClass();
pSR.Symbol=pSFSBaseasISymbol;
//接口转换,对渲染方式进行设置
IGeoFeatureLayerpGFL=pFeatureLayerasIGeoFeatureLayer;
pGFL.Renderer=pSRasIFeatureRenderer;
//地图刷新
axMapControl1.Refresh();
}
在菜单“唯一值渲染”的Click事件处理方法中添加如下代码。
privatevoidDefineUniqueValueRender(IFeatureLayerpFeatureLayer,stringsFieldName)
{
//变量声明
boolbValFound;//判断要素值是否存在
intiFieldIndex;//用于存储字段所在的索引值
//设置颜色列表,用于随机生成颜色(用于填充面状要素)
//设置颜色的基本属性,包括色调(H)、饱和度(S)以及亮度(V)
IRandomColorRamppRCR=newRandomColorRampClass();
pRCR.StartHue=76;
pRCR.EndHue=188;
pRCR.MinSaturation=20;
pRCR.MaxSaturation=40;
pRCR.MaxValue=85;
pRCR.MaxValue=100;
pRCR.UseSeed=true;
pRCR.Seed=43;
//设置唯一值渲染的相关属性
IUniqueValueRendererpUVR=newUniqueValueRendererClass();
pUVR.FieldCount=1;
pUVR.set_Field(0,sFieldName);
//遍历要素类的所有要素,并为每个要素设置基本的渲染形式
//遍历要素类中的所有要素
IFeatureClasspFC=pFeatureLayer.FeatureClass;
IFeatureCursorpFCursor=pFC.Search(null,false);//通过遍历,返回要素指针(FeatureCursor)
IFeaturepFeature=pFCursor.NextFeature();//获取当前第一个要素
//获得指定字段的索引值
IFieldspFields=pFCursor.Fields;
iFieldIndex=pFields.FindField(sFieldName);
//为不同的要素,设置不同的填充颜色
pRCR.Size=pFC.FeatureCount(null);//获得应产生的颜色的数目
boolbOK;
pRCR.CreateRamp(outbOK);//判断随机颜色生产是否成功?
//获得随机生成的颜色列表
IEnumColorspEnumColors=pRCR.Colors;
pEnumColors.Reset();
IColorpColorForFeature=pEnumColors.Next();
//开始遍历,为每个要素设置基本的渲染信息
while(pFeature!
=null)
{
//为每个要素设置基本的渲染符号
ISimpleFillSymbolpSFSForFeature=newSimpleFillSymbolClass();
pSFSForFeature.Style=esriSimpleFillStyle.esriSFSSolid;
pSFSForFeature.Outline.Width=0.4;
pSFSForFeature.Color=pColorForFeature;
//获得当前要素中指定字段的名称
stringsFeatureName;
sFeatureName=pFeature.get_Value(iFieldIndex)asstring;
//设置唯一值渲染的相关属性
pUVR.AddValue(sFeatureName,sFieldName,pSFSForFeatureasISymbol);
pUVR.set_Label(sFeatureName,sFeatureName);
pUVR.set_Symbol(sFeatureName,pSFSForFeatureasISymbol);//设置该值渲染信息
//获得下一组要素和颜色
pFeature=pFCursor.NextFeature();
pColorForFeature=pEnumColors.Next();
}
//接口转换,对渲染方式进行设置
IGeoFeatureLayerpGFL=pFeatureLayerasIGeoFeatureLayer;
pGFL.Renderer=pUVRasIFeatureRenderer;
//地图刷新
axMapControl1.Refresh();
}
在菜单“分级渲染”的Click事件处理方法中添加如下代码。
privatevoidClassBreakRender(IFeatureLayerpFL,stringsFieldName)
{
IRandomColorRamppRCR=newRandomColorRampClass();
IClassBreaksRendererpCBR=newClassBreaksRenderer();
pRCR.StartHue=76;
pRCR.EndHue=188;
pRCR.MinSaturation=20;
pRCR.MaxSaturation=40;
pRCR.MinValue=85;
pRCR.MaxValue=100;
pRCR.UseSeed=true;
pRCR.Seed=43;
pCBR.Field=sFieldName;
pCBR.BreakCount=3;
IFeatureClasspFC=pFL.FeatureClass;
pRCR.Size=3;
boolbOK;
pRCR.CreateRamp(outbOK);
if(bOK==true)
{
IEnumColorspEC=pRCR.Colors;
pEC.Reset();
IColorpColorForFeature=pEC.Next();
for(inti=0;i{
ISimpleFillSymbolpSFSForFeature=newSimpleFillSymbolClass();
pSFSForFeature.Style=esriSimpleFillStyle.esriSFSSolid;
pSFSForFeature.Outline.Width=0.4;
pSFSForFeature.Color=pColorForFeature;
switch(i)
{
case0:
pCBR.set_Break(i,30);
pCBR.set_Label(i,"0-30");
pCBR.set_Description(i,"0-30");
pCBR.set_Symbol(i,pSFSForFeatureasISymbol);
break;
case1:
pCBR.set_Break(i,60);
pCBR.set_Label(i,"31-60");
pCBR.set_Description(i,"31-60");
pCBR.set_Symbol(i,pSFSForFeatureasISymbol);
break;
case2:
pCBR.set_Break(i,100);
pCBR.set_Label(i,"61-100");
pCBR.set_Description(i,"61-100");
pCBR.set_Symbol(i,pSFSForFeatureasISymbol);
break;
}
pColorForFeature=pEC.Next();
}
IGeoFeatureLayerpGFL=pFLasIGeoFeatureLayer;
pGFL.Renderer=pCBRasIFeatureRenderer;
axMapControl1.Refresh();
}
}
3.3、在键盘上按F5键,运行调试。
点击“添加SHP数据”菜单,在弹出的对话框中,选中任意一个shp文件,点击确定,即可把shp文件加载到地图控件中。
⏹点击“简单渲染”菜单,渲染效果如下:
⏹点击“唯一值渲染”菜单,渲染效果如下:
⏹点击“分级渲染”菜单,渲染效果如下: