GIS开发实习报告

发布时间:2020-10-18 来源: 精准扶贫 点击:

 学 号 1221030205 売徐诫產女 f 实习报告 GIS 程序设计实习 起止日期:

 2015 年 7 月 13 日 至 2015 年 7 月 19 日 学 生 姓 名

 吴馁

  班

 级 12 级地信 2 班 成

 绩

  指导 教师 ( 签 字 )

 地质与测绘学院

 2015 年 7 月 20 日

 UwMlMri 财—写 hl M2F Vt*rk*Wi M ; ; Wg«B »<Aa* SHEfl wsa ■住呂 GIS 程序设计实习 一、 实习目的 通过 GIS 程序设计实习,使学生了解需求分析、项目管理方案设计、系统总 体设计以及系统详细设计、系统实施、运行和维护等阶段要完成的具体工作;掌 握在C#和 ArcEngine 环境下构建应用型地理信息系统的方法。

 二、 实习内容 利 熟悉开发环境:Visual Studio 2010; C#; Arc En gi ne 10.1 &讥功能需求分析 J 基于组件技术开发应用型地理信息系统 组件式技术已成为当今软件技术的潮流之一。组件式 GIS 软件的基本思想 是把GIS 各大功能模块划分为几个控件。各个 GIS 控件之间,以及 GIS 控件与 其他非 GIS控件之间,可以方便地通过可视化的软件开发工具集成起来,形成 最终的 GIS 应用。

 重点完成的工作包括:1)建立 ArcGIS Engine 应用程序框架;2)实现对 矢量数据(Shape File 格式)的访问;3)实现采用简单、唯一值、分类等多种 方式对面状矢量数据进行渲染(Ren de)

 。

 三、 实习步骤:

 实习一:初识 ArcGIS Engine 开发环境 1、新建一个 Windows 窗体应用程序

  *

 ¥« IM

 a » HTAdCML wr»* cuke 占筒空 Ci*ud i m rS曙田黑 石序事理口 W J ■Mwi* <* ^et^SnsittSLr-

 2、在新建窗体中添加控件 在工具箱中选择添加 toolbarco ntrol , TOCCo ntrol , Map Co ntrol 控件

 在解决方案资源管理器中双击 program.cs 在主函数中添加 ESRI.ArcGIS.Ru ntimeMa nager.Bi nd(ESRI.ArcGIS.ProductCode.E ngi ne);使得文件可以加载到 MapControl 中。

 t iisin? Syrt en: uainf Sjrt cn.EQlluctiniu. GcnoTiu :

 :

 usinf Syst en.Li.nn :

 :

 VFuudovs. . I- namespMe 大董归竦 | ( jts"tir cl*fs Rrngrim 弓 E) /// <mnuniTy> //<宙用程帛的壬庐口点* /// </5uwniiy> [ ; UTtu*ad] static void I ESRJ T

 A T ^GIS,R r- ii 训卄- F r . ^indCESRI. ArcGIS.P ndii tCod . Enfine): 川 pl i, i— EnabltVisual StyL es (", A ( ( -pJd - iti 3r.* S»tConpai , : ibleTe-xiEendecirg^efault (f; Apulut w RnrJn 艸 5 口:

 () | :

 右击 toolbarcontrol 选择属性,如图选择 Items 选项,添加如图控件

 :鲁 ArcGiS 丄。一匕国曲电 ■oclbarLontrol

  =[Rh Arc5I5 W 1 Fn 斗車 N^mF:

 ^xTCXTC

  -on Bin. Is T CIA I EC T E N JO 口雹 T bl«t t s>s C4^e«ry 39 i Edt F»<tcr i

 Ed.t tlik^ 卩« «.lm i 5il«cti ;ga Find Ugg G CJL -= I I

 亡 1 帀宓 G] flbe IrwjuL ry ■jt C tLLg -hCHi t Ttk WL liMint"k iftjLAiys.t ULL IM

 E^rvie 电二 Fw 沪匸卫严 Ql 右击 MapCo ntrol 属性,在 Ge neral 的 map docume nt 中添加要加载的地图文件

 0 - MET j.Fl “ T«t Canlrols, Comcrundi u 苹 J 1

 A TE GIS

 10.1 Engine TonlbarCerrtrail :韦寺 切:£厉 ItLl En^ne TOCCCr-Iroll NamE. JETOCCGHEriDl 1 —— n i- 1 闻冋 4 CCT5 10.1 Enijrie KapCCXltrol M BTIW .

 aXMaotertfiiH HmTtl

 | Itws| | 园片 [I]

 ¥ ± f?

 Q T LSM

  [^KQtate 』.认 Ir«i^

 * S cr<fllL B arv 口

 ^■tScralL Left

 * S cralt E: gtil

 f Scroll V,

 土 J DSTI

 Ln * t

 ■ *1 j

 If C ITU Ui U

 通过以上步骤添加的控件还只是单独存在, 而我们的程序需要各控件间协同工作, 因此要进 行控件绑定。分别右击 ToolbarControl、TOCControl 控件,将 Buddy 设置为 axMapControll。

 试运行一下如图

  可以看出基本框架已经搭建好了,但是还得调整一下布局 在工具箱的所有 Windows 窗体下选择 —: ■ ■控件,放在窗体里,如图 褐 ArrGIS 10.1. Cnaift* Too b^rControl 亘 ircGlE 1D.1 Engine a>cMapControl 1 分别选择窗体里 TOCControl,MapControl 的属性,将其 Dock 值设置为 fill,如图 调整窗体布局如图 八 For ml ArrGlE W.l Engmw Tc«cltia.rC0ffTTtrol 即址| JkrcGIS 10.1 fnyn ircG]S 10. L Erkgir^ MdpCantiali ■l=S N^ ITHQ ;

 jMMapQinifoll 叫 Fomn l

  实习二:建立 ArcGIS Engine 应用程序框架 2.1 地图浏览 1 、新建项目,添加控件 新建 windows 窗体应用程序, 选择工具箱中 StatusStrip(状态栏 )

 ,将其拖入到窗体, 再选择工具箱中的 ToolbarCo ntrol 控件拖入窗体,修改 dock 值为 TOP,再将 SplitC on tai ner 控件拖入窗体,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 。

 结果如图所示:

 f ■ :F CEI I

 口 "3 £3 T4

  2、力卩 shp 数据 在工具箱中选择 MenuStrip 控件,添加到左上角,命名为文件,下拉选项为打开矢量数 据和打开栅格数据,如图:

 选中文件控件下的加入矢量数据控件, 双击事件并写入代码,在开始使用 ArcGIS Engine 进行编码前,首先需要添加 ArcGIS 的引用,在解决方案管理器中右键点击 添加引用”,如 图:

  usi ng ESRI.ArcGIS.Carto; usi ng ESRI.ArcGIS.C on trols; usi ng ESRI.ArcGIS.esriSystem; usi ng ESRI.ArcGIS.Display; usi ng ESRI.ArcGIS.Geometry; usi ng ESRI.ArcGIS.SystemUI; usi ng ESRI.ArcGIS.DataSourcesRaster; ///////////////为 SHP 数据功能 增加的类库 usi ng ESRI.ArcGIS.DataSourcesFile; usi ng ESRI.ArcGIS.Geodatabase; using Syste m.IO;

  键入的代码如图:

 rrivarte void 打 JF® TocISt ripHenLiIten_C1 ick""ot j ezt sendsr. E"jentAras e) I

 |apenF^leDialogl.Filter = * sl".apefile^L l *.shp) |*. shp"; openFileDialojl.MuL ti select = false; DialofResult pDialngFjegul! = apenFileDialogl. Shcmt)ialog (": if (pDialagfiEsult == Dialog?esalt,OK) { st iinf pPart 上 = oTEnFileQialogl .FiLeHajne ; st i pF alder = Syst em, Iu, Path ? recto ryWaJiie [pF art h); string piFileNa*e = System. IQ,Fath, GetFileWsme(praTh): IWuLkipaucFc. I .1; pWu:kipaJc-Fabt <jry = [ ICM

 □ cfi 1 cW J ikipa. J cFiut J

 1 (). T" orbcpico pWockzpacs - pWorkspaceFCpenFrcnFi ^pFolder, Q) IFe^iur^Wo rkrp ■ - pFe ature^fc.rk sp are — p.Wo rkrp ac>? ww IF ta.+.lveV^crkrpi re; TF P

 -.+nr^ -i?pFC — pFpsrtiirpVorlz"ffpar a. rtppnFpatUTe 匚 1 hfm (pFi 1 pTffajie): IFeatureLayer pFLayer = new FeartuceLayerO ; ; pFLavein Featured lass = rFC; pFLayetn Name = pFC ?

 Al ;asNanie ILaye r pLayer - pFLayer as ILayer; IT Tap pMap = ^KWafCantrol 1 IVIap: pMap. AddLayer (pLayer) axJIapControll ?

 ActiveV^ew ?

 Ref resh();

  实习三:矢量要素符号化 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.Outline.Width = 0.4; // 设置边框的宽度 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, @"CONTINEN)T; " private void DefineUniqueValueRender( IFeatureLayer pFeatureLayer, string sFieldName) { // 变量声明

  bool bValFound; // 判断要素值是否存在 int iFieldIndex; // 用于存储字段所在的索引值 // 设置颜色列表,用于随机生成颜色(用于填充面状要素) //设置颜色的基本属性,包括色调(H)、饱和度(S)以及亮度( V IRandomColorRamppRCR = new RandomColorRam(p); pRCR.StartHue = 76; pRCR.EndHue = 188; pRCR.MinSaturation = 20; pRCR.MaxSaturation = 40; pRCR.MaxValue = 85; pRCR.MaxValue = 100; pRCR.UseSeed = 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.Outline.Width = 0.4; 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 = pUVRas 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) { IRandomColorRamppRCR = new RandomColorRam(p); IClassBreaksRenderer pCBR = new ClassBreaksRenderer (); 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 = 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++) {

 pSFSForFeature = new SimpleFillSymbol (); pSFSForFeature1 = new SimpleFillSymbol (); esriSimpleFillStyle .esriSFSSolid; pSFSForFeature.Outline.Width = 0.4; pSFSForFeature.Color = pColorForFeature; switch (i) {

 case 0: pCBR.set_Break(i, 90); pCBR.set_Label(i,

 ISimpleFillSymbol ISimpleFillSymbol pSFSForFeature.Style = "-92 - 90" );

 pCBR.set_Descriptio n(i, "-92 - 90"); pCBR.set_Symbol(i, pSFSForFeature as ISymbol); pSFSForFeaturel.Color = pSFSForFeature.Color; break; case 1:

  pCBR.set_Break(i, 153); pCBR.set_Label(i, pCBR.set_Descriptio n(i. "-90 - 90"); "-90 - 90"); pCBR.set_Symbol(i, pSFSForFeature as ISymbol); break; } pColorForFeature = pEC.Next(); } IGeoFeatureLayer pGFL = pFL as IGeoFeatureLayer pGFL.Renderer = pCBR as IFeatureRenderer ; axMapCo ntrol1.Refresh(); } } 四、实习结果 1、实习一结果

 2、实习二结果

  3、实习三结果 叫 -F-orml . * I — 1 口 Map F m Conlne^Tts

 k融 轻■§网 iw?7 沽"玉跖 D5 羽却価

 "时 F(XE :

 I - . 二

  立 I 丰绘屢壬

 [瓯-上;- 1 Igl 巧? W1DM 兰严呷 MW7974 昨舁

 五、实习感受

 通过此次实习,了解了用ARC Engine进行地理信息系统的二次开发的大致 流程,利用 ARC Engine 开发可以很好地定制自己所需的功能,而且也不是很难, 在 VS 中敲代码时很多方法和接口就自动提示出现,都不需要记住那么多方法, 只要了解那些方法的功能,需要用时能够调用就行。开发的关键还是在于各种 接口以及控件方法的引用。此次实习也只是接触了皮毛,要想更好地利用其进 行地理信息系统的开发还是得熟悉和了解各种接口和方法的功能,要学会利用 帮助文档来查询所需的各种借口和方法。

相关热词搜索:实习报告 开发 GIS

版权所有 蒲公英文摘 www.zhaoqt.net