GIS開發(fā)實習報告
發(fā)布時間:2020-10-18 來源: 精準扶貧 點擊:
學 號 1221030205 売徐誡產(chǎn)女 f 實習報告 GIS 程序設(shè)計實習 起止日期:
2015 年 7 月 13 日 至 2015 年 7 月 19 日 學 生 姓 名
吳餒
班
級 12 級地信 2 班 成
績
指導 教師 ( 簽 字 )
地質(zhì)與測繪學院
2015 年 7 月 20 日
UwMlMri 財—寫 hl M2F Vt*rk*Wi M ; ; Wg«B »<Aa* SHEfl wsa ■住呂 GIS 程序設(shè)計實習 一、 實習目的 通過 GIS 程序設(shè)計實習,使學生了解需求分析、項目管理方案設(shè)計、系統(tǒng)總 體設(shè)計以及系統(tǒng)詳細設(shè)計、系統(tǒng)實施、運行和維護等階段要完成的具體工作;掌 握在C#和 ArcEngine 環(huán)境下構(gòu)建應用型地理信息系統(tǒng)的方法。
二、 實習內(nèi)容 利 熟悉開發(fā)環(huán)境:Visual Studio 2010; C#; Arc En gi ne 10.1 &譏功能需求分析 J 基于組件技術(shù)開發(fā)應用型地理信息系統(tǒng) 組件式技術(shù)已成為當今軟件技術(shù)的潮流之一。組件式 GIS 軟件的基本思想 是把GIS 各大功能模塊劃分為幾個控件。各個 GIS 控件之間,以及 GIS 控件與 其他非 GIS控件之間,可以方便地通過可視化的軟件開發(fā)工具集成起來,形成 最終的 GIS 應用。
重點完成的工作包括:1)建立 ArcGIS Engine 應用程序框架;2)實現(xiàn)對 矢量數(shù)據(jù)(Shape File 格式)的訪問;3)實現(xiàn)采用簡單、唯一值、分類等多種 方式對面狀矢量數(shù)據(jù)進行渲染(Ren de)
。
三、 實習步驟:
實習一:初識 ArcGIS Engine 開發(fā)環(huán)境 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 在主函數(shù)中添加 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 滬匸衛(wèi)嚴 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
通過以上步驟添加的控件還只是單獨存在, 而我們的程序需要各控件間協(xié)同工作, 因此要進 行控件綁定。分別右擊 ToolbarControl、TOCControl 控件,將 Buddy 設(shè)置為 axMapControll。
試運行一下如圖
可以看出基本框架已經(jīng)搭建好了,但是還得調(diào)整一下布局 在工具箱的所有 Windows 窗體下選擇 —: ■ ■控件,放在窗體里,如圖 褐 ArrGIS 10.1. Cnaift* Too b^rControl 亙 ircGlE 1D.1 Engine a>cMapControl 1 分別選擇窗體里 TOCControl,MapControl 的屬性,將其 Dock 值設(shè)置為 fill,如圖 調(diào)整窗體布局如圖 八 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(狀態(tài)欄 )
,將其拖入到窗體, 再選擇工具箱中的 ToolbarCo ntrol 控件拖入窗體,修改 dock 值為 TOP,再將 SplitC on tai ner 控件拖入窗體,Dock 設(shè)置為 Fill,將 TabControl 控件拖入 Panel1,將 Alignment 屬性設(shè)置為 Bottom,Dock 屬性設(shè)置為 Fill。點擊 TabPages 屬性右邊的按鈕,彈出 TabPage 集合編輯器, 將 tabPage1 的 Name 設(shè)置為 "Layer ; " Text 設(shè)置為 圖層”;將 tabPage2 的 Name 設(shè)置為 “ Property, Text 設(shè)置為 屬性”。
選擇圖層”選項卡,拖入 TOCControl 控件,設(shè)置 Dock 屬性為 Fill,選擇屬性”選 項卡,拖入所有 Windows 窗體|PropertyGrid 控件,設(shè)置 Dock 屬性為 Fill。
拖入 TabControl 控件到 Panel2,設(shè)置 Dock 屬性為 Fill 。
結(jié)果如圖所示:
f ■ :F CEI I
口 "3 £3 T4
2、力卩 shp 數(shù)據(jù) 在工具箱中選擇 MenuStrip 控件,添加到左上角,命名為文件,下拉選項為打開矢量數(shù) 據(jù)和打開柵格數(shù)據(jù),如圖:
選中文件控件下的加入矢量數(shù)據(jù)控件, 雙擊事件并寫入代碼,在開始使用 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 數(shù)據(jù)功能 增加的類庫 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 事件;或 者雙擊“簡單渲染”菜單,在方法內(nèi)輸入處理代碼。部分代碼如下:
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) {
// 設(shè)置用于渲染的顏色 IRgbColor pColor = new RgbColor(); pColor.Red = 255; pColor.Blue = 0; pColor.Green = 0; // 設(shè)置用于渲染的符號的基本屬性(面狀符號) ISimpleFillSymbol pSFSBase = new SimpleFillSymbol (); pSFSBase.Style = esriSimpleFillStyle .esriSFSSolid; // 設(shè)置填充方式 pSFSBase.Outline.Width = 0.4; // 設(shè)置邊框的寬度 pSFSBase.Color = pColor as IColor ; // 設(shè)置簡單渲染的相關(guān)屬性 ISimpleRenderer pSR = new SimpleRenderer (); pSR.Symbol = pSFSBase as ISymbol ; // 接口轉(zhuǎn)換,對渲染方式進行設(shè)置 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; // 用于存儲字段所在的索引值 // 設(shè)置顏色列表,用于隨機生成顏色(用于填充面狀要素) //設(shè)置顏色的基本屬性,包括色調(diào)(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; // 設(shè)置唯一值渲染的相關(guān)屬性 IUniqueValueRenderer pUVR = new UniqueValueRenderer (); pUVR.FieldCount = 1; pUVR.set_Field(0, sFieldName); // 遍歷要素類的所有要素,并為每個要素設(shè)置基本的渲染形式 // 遍歷要素類中的所有要素 IFeatureClass pFC = pFeatureLayer.FeatureClass; IFeatureCursor pFCursor = pFC.Search( null , false ); // 通過遍歷,返回要素指針 ( FeatureCursor ) IFeature pFeature = pFCursor.NextFeature(); // 獲取當前第一個要素 // 獲得指定字段的索引值 IFields pFields = pFCursor.Fields; iFieldIndex = pFields.FindField(sFieldName); // 為不同的要素,設(shè)置不同的填充顏色 pRCR.Size = pFC.FeatureCount( null ); // 獲得應產(chǎn)生的顏色的數(shù)目 bool bOK; pRCR.CreateRamp( out bOK); // 判斷隨機顏色生產(chǎn)是否成功? // 獲得隨機生成的顏色列表 IEnumColors pEnumColors = pRCR.Colors;pEnumColors.Reset(); IColor pColorForFeature = pEnumColors.Next(); // 開始遍歷,為每個要素設(shè)置基本的渲染信息 while (pFeature != null ) {
// 為每個要素設(shè)置基本的渲染符號 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 ; // 設(shè)置唯一值渲染的相關(guān)屬性 pUVR.AddValue(sFeatureName, sFieldName, pSFSForFeature as ISymbol ); pUVR.set_Label(sFeatureName, sFeatureName); pUVR.set_Symbol(sFeatureName, pSFSForFeature as ISymbol ); // 設(shè)置該值渲染 信息 // 獲得下一組要素和顏色 pFeature = pFCursor.NextFeature(); pColorForFeature = pEnumColors.Next(); } // 接口轉(zhuǎn)換,對渲染方式進行設(shè)置 IGeoFeatureLayer pGFL = pFeatureLayer as IGeoFeatureLayer ; pGFL.Renderer = pUVRas IFeatureRenderer ; // 地圖刷新 axMapControl1.Refresh(); } 3、分級渲染 先打開 ArcMap 講要導入數(shù)據(jù)的屬性表打開添加一個字段命名為 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(); } } 四、實習結(jié)果 1、實習一結(jié)果
2、實習二結(jié)果
3、實習三結(jié)果 叫 -F-orml . * I — 1 口 Map F m Conlne^Tts
k融 輕■§網(wǎng) iw?7 沽"玉跖 D5 羽卻価
"時 F(XE :
I - . 二
立 I 豐繪屢壬
。郛T-上;- 1 Igl 巧? W1DM 蘭嚴呷 MW7974 昨舁
五、實習感受
通過此次實習,了解了用ARC Engine進行地理信息系統(tǒng)的二次開發(fā)的大致 流程,利用 ARC Engine 開發(fā)可以很好地定制自己所需的功能,而且也不是很難, 在 VS 中敲代碼時很多方法和接口就自動提示出現(xiàn),都不需要記住那么多方法, 只要了解那些方法的功能,需要用時能夠調(diào)用就行。開發(fā)的關(guān)鍵還是在于各種 接口以及控件方法的引用。此次實習也只是接觸了皮毛,要想更好地利用其進 行地理信息系統(tǒng)的開發(fā)還是得熟悉和了解各種接口和方法的功能,要學會利用 幫助文檔來查詢所需的各種借口和方法。
熱點文章閱讀