学号
实习报告
GIS程序设计实习
起止日期: 2015 年 7 月13 日至 2015 年 7 月 19 日学生姓名吴馁
班级12级地信2 班
成绩
指导教师(签字)
地质与测绘学院
2015年 7 月 20 日
GIS程序设计实习
一、实习目的
通过GIS程序设计实习,使学生了解需求分析、项目管理方案设计、系统总体设计以及系统详细设计、系统实施、运行和维护等阶段要完成的具体工作;掌握在C#和ArcEngine环境下构建应用型地理信息系统的方法。
二、实习内容
熟悉开发环境:Visual Studio 2010; C#; Arc Engine 10.1
功能需求分析
基于组件技术开发应用型地理信息系统
组件式技术已成为当今软件技术的潮流之一。组件式GIS软件的基本思想是把GIS 各大功能模块划分为几个控件。各个GIS控件之间,以及GIS控件与其他非GIS控件之间,可以方便地通过可视化的软件开发工具集成起来,形成最终的GIS应用。
重点完成的工作包括:1)建立ArcGIS Engine 应用程序框架;2)实现对矢量
数据(Shape File格式)的访问;3)实现采用简单、唯一值、分类等多种方式对面状矢量数据进行渲染(Render)。
三、实习步骤:
实习一:初识ArcGIS Engine 开发环境
1、新建一个Windows窗体应用程序
2、在新建窗体中添加控件
在工具箱中选择添加toolbarcontrol,TOCControl,MapControl控件
在解决方案资源管理器中双击program.cs在主函数中添加);使得文件可以加载到MapControl中。
右击toolbarcontrol选择属性,如图选择Items选项,添加如图控件
右击MapControl属性,在General的map document中添加要加载的地图文件通过以上步骤添加的控件还只是单独存在,而我们的程序需要各控件间协同工作,因此要进行控件绑定。分别右击ToolbarControl、TOCControl控件,将Buddy 设置为axMapControl1。
试运行一下如图
可以看出基本框架已经搭建好了,但是还得调整一下布局
在工具箱的所有Windows窗体下选择控件,放在窗体里,如图分别选择窗体里TOCControl,MapControl的属性,将其Dock值设置为fill,如图
调整窗体布局如图
实习二:建立ArcGIS Engine 应用程序框架
2.1 地图浏览
1、新建项目,添加控件
新建windows窗体应用程序,选择工具箱中StatusStrip(状态栏),将其拖入
到窗体,再选择工具箱中的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。
结果如图所示:
2、加
shp
数据
在工
具箱
中选
择
Menu
Stri
p控
件,
添加到左上角,命名为文件,下拉选项为打开矢量数据和打开栅格数据,如图:
同样
添加
地图
渲
染,
及其
下拉
选项
简单
渲
染、
唯一
值渲染、分级渲染,如图:
3、代
码处
理
选中
文件
控件
下的
加入
矢量
数据
控
件,
双击事件并写入代码,在开始使用ArcGIS Engine进行编码前,首先需要添加ArcGIS 的引用,在解决方案管理器中右键点击“添加引用”,如图:
using
using
using
using
using
using
using
///////////////为SHP数据功能增加的类库
using
using
using System.IO;
键入的代码如图:
实习三:矢量要素符号化
1、简单渲染
选中“简单渲染”菜单,在属性框中点击事件按钮,在事件列表中双击Click 事件;或者双击“简单渲染”菜单,在方法内输入处理代码。部分代码如下:
private void简单渲染ToolStripMenuItem_Click(object sender, EventArgs e)
{
IFeatureLayer pFLForRender = axMapControl1.get_Layer(0) as IFeatureLayer;
SimpleRender(pFLForRender, @"");
}
private void SimpleRender(IFeatureLayer pFeatureLayer, string sFieldName)
{
//设置用于渲染的颜色
IRgbColor pColor = new RgbColor();
pColor.Red = 255;
pColor.Blue = 0;
pColor.Green = 0;
//设置用于渲染的符号的基本属性(面状符号)
ISimpleFillSymbol pSFSBase = new SimpleFillSymbol();
pSFSBase.Style = esriSimpleFillStyle.esriSFSSolid; //设置填充方式
//设置边框的宽度
pSFSBase.Color = pColor as IColor;
//设置简单渲染的相关属性
ISimpleRenderer pSR = new SimpleRenderer();
pSR.Symbol = pSFSBase as ISymbol;
//接口转换,对渲染方式进行设置
IGeoFeatureLayer pGFL = pFeatureLayer as IGeoFeatureLayer;
pGFL.Renderer = pSR as IFeatureRenderer;
//地图刷新
axMapControl1.Refresh();
}
2、唯一值渲染
private void唯一值渲染ToolStripMenuItem_Click(object sender, EventArgs e)
{
IFeatureLayer pFLForRender = axMapControl1.get_Layer(0) as IFeatureLayer;
DefineUniqueValueRender(pFLForRender, @"CONTINENT");
}
private void DefineUniqueValueRender(IFeatureLayer pFeatureLayer, string sFieldName) {
//变量声明
bool bValFound; //判断要素值是否存在
int iFieldIndex; //用于存储字段所在的索引值
//设置颜色列表,用于随机生成颜色(用于填充面状要素)
//设置颜色的基本属性,包括色调(H)、饱和度(S)以及亮度(V)
IRandomColorRamp pRCR = new RandomColorRamp();
pRCR.StartHue = 76;
pRCR.EndHue = 188;
pRCR.MinSaturation = 20;
pRCR.MaxSaturation = 40;
pRCR.MaxValue = 85;
pRCR.MaxValue = 100;
https://www.wendangku.net/doc/b017286158.html,eSeed = true;
pRCR.Seed = 43;
//设置唯一值渲染的相关属性
IUniqueValueRenderer pUVR = new UniqueValueRenderer();
pUVR.FieldCount = 1;
pUVR.set_Field(0, sFieldName);
//遍历要素类的所有要素,并为每个要素设置基本的渲染形式
//遍历要素类中的所有要素
IFeatureClass pFC = pFeatureLayer.FeatureClass;
IFeatureCursor pFCursor = pFC.Search(null, false); //通过遍历,返回要素指针(FeatureCursor)
IFeature pFeature = pFCursor.NextFeature(); //获取当前第一个要素
//获得指定字段的索引值
IFields pFields = pFCursor.Fields;
iFieldIndex = pFields.FindField(sFieldName);
//为不同的要素,设置不同的填充颜色
pRCR.Size = pFC.FeatureCount(null); //获得应产生的颜色的数目
bool bOK;
pRCR.CreateRamp(out bOK); //判断随机颜色生产是否成功?
//获得随机生成的颜色列表
IEnumColors pEnumColors = pRCR.Colors;
pEnumColors.Reset();
IColor pColorForFeature = pEnumColors.Next();
//开始遍历,为每个要素设置基本的渲染信息
while (pFeature != null)
{
//为每个要素设置基本的渲染符号
ISimpleFillSymbol pSFSForFeature = new SimpleFillSymbol();
pSFSForFeature.Style = esriSimpleFillStyle.esriSFSSolid;
pSFSForFeature.Color = pColorForFeature;
//获得当前要素中指定字段的名称
string sFeatureName;
sFeatureName = pFeature.get_Value(iFieldIndex) as string;
//设置唯一值渲染的相关属性
pUVR.AddValue(sFeatureName, sFieldName, pSFSForFeature as ISymbol);
pUVR.set_Label(sFeatureName, sFeatureName);
pUVR.set_Symbol(sFeatureName, pSFSForFeature as ISymbol); //设置该值渲染信息//获得下一组要素和颜色
pFeature = pFCursor.NextFeature();
pColorForFeature = pEnumColors.Next();
}
//接口转换,对渲染方式进行设置
IGeoFeatureLayer pGFL = pFeatureLayer as IGeoFeatureLayer;
pGFL.Renderer = pUVR as IFeatureRenderer;
//地图刷新
axMapControl1.Refresh();
}
3、分级渲染
先打开ArcMap讲要导入数据的属性表打开添加一个字段命名为X,并进行计算几何处理,分级渲染便以这个字段里的值分级,分为两级,最小值到90,和90到最大值。代码如下:
private void分类渲染ToolStripMenuItem_Click(object sender, EventArgs e)
{
IFeatureLayer pFLForRender = axMapControl1.get_Layer(0) as IFeatureLayer;
ClassBreakRender(pFLForRender, @"x");
}
private void ClassBreakRender(IFeatureLayer pFL, string sFieldName)
{
IRandomColorRamp pRCR = new RandomColorRamp();
IClassBreaksRenderer pCBR = new ClassBreaksRenderer();
pRCR.StartHue = 76;
pRCR.EndHue = 188;
pRCR.MinSaturation = 20;
pRCR.MaxSaturation = 40;
pRCR.MinValue = 85;
pRCR.MaxValue = 100;
https://www.wendangku.net/doc/b017286158.html,eSeed = true;
pRCR.Seed = 43;
pCBR.Field = sFieldName;
pCBR.BreakCount = 2;
IFeatureClass pFC = pFL.FeatureClass;
pRCR.Size = 3;
bool bOK;
pRCR.CreateRamp(out bOK);
if (bOK == true)
{
IEnumColors pEC = pRCR.Colors;
pEC.Reset();
IColor pColorForFeature = pEC.Next();
for (int i = 0; i < pCBR.BreakCount; i++)
{
ISimpleFillSymbol pSFSForFeature = new SimpleFillSymbol();
ISimpleFillSymbol pSFSForFeature1 = new SimpleFillSymbol(); pSFSForFeature.Style = esriSimpleFillStyle.esriSFSSolid;
pSFSForFeature.Color = pColorForFeature;
switch (i)
{
case 0:
pCBR.set_Break(i, 90);
pCBR.set_Label(i, "-92 - 90");
pCBR.set_Description(i, "-92 - 90");
pCBR.set_Symbol(i, pSFSForFeature as ISymbol);
pSFSForFeature1.Color = pSFSForFeature.Color;
break;
case 1:
pCBR.set_Break(i, 153);
pCBR.set_Label(i, "-90 - 90");
pCBR.set_Description(i, "-90 - 90");
pCBR.set_Symbol(i, pSFSForFeature as ISymbol);
break;
}
pColorForFeature = pEC.Next();
}
IGeoFeatureLayer pGFL = pFL as IGeoFeatureLayer;
pGFL.Renderer = pCBR as IFeatureRenderer;
axMapControl1.Refresh();
}
}
四、实习结果
1、实习一结果
2、实习二结果
3、实习三结果
五、实习感受
通过此次实
习,了解了用ARC
Engine进行地理
信息系统的二次
开发的大致流
程,利用ARC
Engine开发可以
很好地定制自己
所需的功能,而
且也不是很难,
在VS中敲代码时很多方法和接口就自动提示出现,都不需要记住那么多方法,只要了解那些方法的功能,需要用时能够调用就行。开发的关键还是在于各种接口以及控件方法的引用。此次实习也只是接触了皮毛,要想更好地利用其进行地理信息系统的开发还是得熟悉和了解各种接口和方法的功能,要学会利用帮助文档来查询所需的各种借口和方法。