下載本文檔
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、ArcGIS Engine 二次開(kāi)發(fā)提高篇1縮略圖(鷹眼)鷹眼功能是GIS的主要功能之一,當(dāng)?shù)貓D范圍很大時(shí),它可以很好的為用戶(hù)指明當(dāng)前地圖的范圍。在本小節(jié)中我們將學(xué)習(xí)如何制作這種鷹眼。1.1 添加控件新建一個(gè) C#.Net項(xiàng)目,項(xiàng)目名稱(chēng)為 OverView,將Forml的名字設(shè)置為 MainForm ,并添加 ToolbarControl 、兩個(gè) MapControl和LicenceControl等四個(gè)控件。布局如下圖所示。左邊的axMapControll用于地圖數(shù)據(jù)顯示和操作,右邊 axMapControl2用于鷹眼顯示。圖1界面布局在ToolbarControl加載添加數(shù)據(jù)按鈕和地圖瀏覽的
2、功能按鈕,如下圖所示,并將ToolbarControl的伙伴控件設(shè)為 axMapControl1。圖2添加按鈕1.2 代碼添加及解釋鷹眼用來(lái)顯示主窗體當(dāng)前視圖范圍在全景視圖中的位置,在ArcMap中使用一個(gè)線框在鷹眼視圖中標(biāo)識(shí)。當(dāng)主視圖中的視圖范圍改變時(shí),鷹眼中的線框隨之改變, 當(dāng)拖動(dòng)鷹眼視圖中的紅線框時(shí),主視圖中的視圖范圍也隨之改變。下面開(kāi)始實(shí)現(xiàn)鷹眼功能,添加、三個(gè)引用。首先在axMapControl1中視圖范圍改變時(shí)鷹眼窗體要做出對(duì)應(yīng)的響應(yīng),即繪制線框并顯示,在 OnExtentUpdated 事件中添加代碼如下:private void axMapControl1_OnExtentUpd
3、ated( object sender, e)et項(xiàng)目,項(xiàng)目名稱(chēng)為Buffer ,將Form1的名字設(shè)置為 MainForm ,并添加ToolbarControl 、MapControl、TOCControl、LicenceControl 和 Button 等五個(gè)控件。并將 ToolbarControl 、TOCControl 的伙伴控件設(shè)為 MapControl , Button 控件的 Name屬性設(shè)定為 btnBuffer , Text屬性設(shè)定為"緩沖區(qū)分析”??丶季中Ч缦聢D所示。圖3控件布局效果在ToolbarControl加載添加數(shù)據(jù)按鈕和地圖瀏覽的功能按鈕,如下圖所示
4、。圖4添加按鈕1.2.1 代碼添加及解釋首先添加如下四個(gè)命名空間的引用。在使用Geoprocessor工具實(shí)現(xiàn)緩沖區(qū)分析時(shí),需要首先定義一個(gè)Geoprocessor對(duì)象,因?yàn)槊臻g”也包含Geoprocessor類(lèi),為了避免混淆,我們使用命名空間來(lái)定義Geoprocessor ,然后設(shè)置Geoprocessor中的環(huán)境參數(shù),這里我們使用默認(rèn)參數(shù)。然后定義一個(gè)操作類(lèi) Buffer ,并設(shè)置 參數(shù),生成緩沖區(qū)的參數(shù)包含原始圖層,緩沖半徑和輸出路徑,最后使用已定義的 Geoprocessor對(duì)象執(zhí)行即可。雙擊“生成緩存區(qū)”按鈕,添加代碼如下:private void btnBuffer_Click
5、( object sender, EventArgs e)hp)|*.shp" hp" !=("輸出路徑錯(cuò)誤!");return ; et項(xiàng)目,項(xiàng)目名稱(chēng)為OverLay ,將Forml的名字設(shè)置為 MainForm,并添加ToolbarControl 、MapControl、TOCControl、LicenceControl 和 Button 等五個(gè)控件。并將 ToolbarControl 、TOCControl 的伙伴控件設(shè)為MapControl , Button 控件的 Name屬性設(shè)定為btnIntersect , Text屬性設(shè)定為"疊
6、置求交"。控件布局效果如下圖所示。圖5控件布局效果在ToolbarControl加載添加數(shù)據(jù)按鈕和地圖瀏覽的功能按鈕,如下圖所示圖6添加按鈕1.2.2 代碼添加及解釋首先添加如下引用:using與緩沖區(qū)分析的實(shí)現(xiàn)類(lèi)似,在使用 Geoprocessor工具實(shí)現(xiàn)疊置分析時(shí),需要首先定義一個(gè) Geoprocessor對(duì)象,因?yàn)槊臻g” 也包含Geoprocessor類(lèi),為了避免混淆,我們使用命 名空間來(lái)定義Geoprocessor ,然后設(shè)置Geoprocessor中的環(huán)境參數(shù),這里我們使用默認(rèn)參數(shù)。然 后定義一個(gè)操作類(lèi),這里為 Intersect ,然后設(shè)置其操作參數(shù),這里我們僅設(shè)置輸
7、入的要素,最 后使用已定義的 Geoprocessor對(duì)象執(zhí)行即可。雙擊“生成緩存區(qū)”按鈕,添加代碼如下:private void btnIntersect_Click( object sender, EventArgs e)hp)|*.shp"="選擇第一個(gè)要素"hp)|*.shp""選擇第二個(gè)要素"hp)|*.shp" hp"string strName = (index);Unionet項(xiàng)目,項(xiàng)目名稱(chēng)為 OverLay ,將Form1的名字設(shè)置為 MainForm , Text 屬性設(shè)為"地圖編輯”
8、,并添力口ToolbarControl 、MapControl、TOCControl、LicenceControl四個(gè)Button、兩個(gè) ComboBox兩個(gè) Label和一個(gè) GroupBox等控件。將 ToolbarControl 、TOCControl 的伙伴控件設(shè)為 MapControl , ToolbarControl 加載添加 數(shù)據(jù)按鈕和地圖瀏覽的功能按鈕。控件布局效果如下圖所示。圖7界面效果控件屬性設(shè)置如下:表1控件屬性設(shè)置控件類(lèi)型Name屬性Text屬性控件說(shuō)明Label選擇圖層:Label編輯任務(wù):ComboBoxcboLayersMapControl中的圖層ComboBox
9、cboTasks編輯的方式ButtonbtnRefreshLayers更新圖層cboLayers載入圖層名稱(chēng)ButtonbtnStartEditing開(kāi)始編輯開(kāi)始編輯狀態(tài)ButtonbtnSave保存保存編輯ButtonbtnStopEditing結(jié)束編輯結(jié)束編輯狀態(tài)GroupBox地圖編輯控件容器1.3 添加引用和代碼ArcEngine中的地圖編輯使用 的工作空間進(jìn)行編輯時(shí),首先使用 StartEditing方法開(kāi)始編輯狀態(tài),IWorkspaceEdit接口來(lái)進(jìn)行編輯狀態(tài)的管理,在需要對(duì)指定IWorkspaceEdit獲取該工作空間的數(shù)據(jù),然后使用StartEditOperation使用St
10、opEditOperation方法關(guān)閉編輯操作,使用方法打開(kāi)具體編輯的操作,編輯完成后,StopEditing 方法關(guān)閉編輯狀態(tài),完成編輯。涉及到了比較復(fù)雜的鼠標(biāo)與地在本例中,我們實(shí)現(xiàn)了新的點(diǎn)線面要素的創(chuàng)建和移動(dòng)的功能,圖間的交互,這個(gè)功能的實(shí)現(xiàn)中,IDisplayFeedback是一個(gè)十分關(guān)鍵的接口,它具有涉及創(chuàng)建要素,移動(dòng)要素、編輯節(jié)點(diǎn)等31個(gè)實(shí)現(xiàn)類(lèi),能夠?qū)崿F(xiàn)鼠標(biāo)與地圖交互中的事件的追蹤,返回新的幾何對(duì)象。本例的實(shí)現(xiàn),我們首先來(lái)添加一個(gè)編輯類(lèi),將涉及到的編輯的相關(guān)方法抽象到這個(gè)類(lèi)中。項(xiàng)目中添加“ Edit ”類(lèi)。添加如下引用。using定義如下成員變量。orkspace;private b
11、ool misEditing;mWorkspaceEdit = pWorkspaceas IWorkspaceEdit ;if (mWorkspaceEdit = null ) return ;creenDisplay;pNewLineFeedback = mDisplayFeedbackas INewLineFeedback ;creenDisplay;pNewPolygonFeedback = mDisplayFeedbackas INewPolygonFeedback ;creenDisplay;et項(xiàng)目,項(xiàng)目名稱(chēng)為MapRender,將Forml的名字設(shè)置為 MainForm,并添加
12、ToolbarControl 、MapControl、TOCControl、LicenceControl 和 Button 等五個(gè)控件。并將 ToolbarControl 、TOCControl的伙伴控件設(shè)為 MapControl??丶季中Ч缦聢D所示。圖8控件布局效果在ToolbarControl加載添加數(shù)據(jù)按鈕和地圖瀏覽的功能按鈕,如下圖所示。圖9工具欄設(shè)置效果添加Buttom按鈕的屬性設(shè)置如下:表4控件屬性設(shè)置控件類(lèi) 型Name屬性Text屬性控件說(shuō)明ButtonbtnSimpIeRenderer簡(jiǎn)單著色對(duì)圖層簡(jiǎn)單著色ButtonbtnCIassBreakRenderer分級(jí)著色對(duì)圖層
13、分級(jí)著色ButtonbtnUniqueValueRenderer唯一值著色對(duì)圖層唯一值著色ButtonbtnSymbolRenderer依比例符號(hào)著色對(duì)圖層依比例符號(hào)著色ButtonbtnChartRenderer質(zhì)量圖著色對(duì)圖層質(zhì)量圖著色ButtonbtnDotDensityRenderer點(diǎn)密度著色對(duì)圖層點(diǎn)密度著色1.4 代碼添加及解釋該工程需要添加如下引用:using usingusing usingusing在axMapControll控件中添加圖層,如圖所示:圖10添加初始化圖層1.簡(jiǎn)單著色代碼添加添力口 btnSimpieRenderer 按鈕的Click事件代碼:private
14、void btnSimpIeRenderer_Click (object sender , EventArgs e) IMap pMap =;分級(jí)著色代碼添加在前面代碼的基礎(chǔ)上添加如下引用:using using然后添加 btnCIassBreakRenderer 按鈕的 Click 事件代碼:private void btnCIassBreakRenderer_Click ( object sender , EventArgs e) IGeoFeatureLayer pGeoFeatureL ;ITable pTable ;IClassifyGEN pClassify ;ITableHist
15、ogram pTableHistogram ;IBasicHistogram pHistogram ;object dataFrequency ;object dataValues ;double Classes ; int ClassesCount ;IClassBreaksRenderer pClassBreaksRenderer ;IHsvColor pFromColor ;IHsvColor pToColor ;IAlgorithmicColorRamp pAlgorithmicCR ;IEnumColors pEnumColors ; bool ok;IColor pColor ;I
16、SimpleFillSymbol pSimpleFillS ; int lbreakIndex ;string strPopField = "POP1990"int numDesiredClasses = 5;IMap pMap = ;= 0;pGeoFeatureL = ( IGeoFeatureLayer )(0);ET 中必須使用 IClassifyGEN 這個(gè)借口定義的對(duì)象才能實(shí)現(xiàn)分級(jí)。3. 唯一值著色代碼添加添加 btnUniqueValueRenderer 按鈕的 Click 事件代碼:private void btnUniqueValueRenderer_Cl
17、ick ( object sender , EventArgs e) IGeoFeatureLayer m_pGeoFeatureL ;IUniqueValueRenderer pUniqueValueR ;IFillSymbol pFillSymbol ;IColor pNextUniqueColor ;IEnumColors pEnumRam;pITable pTable ;int lfieldNumber ;IRow pNextRow;IRowBuffer pNextRowBuffer ;ICursor pCursor ;IQueryFilter pQueryFilter ; strin
18、g codeValue ;IRandomColorRamp pColorRamp;string strNameField = "State_Name" ;IMap pMap = ;= 0;m_pGeoFeatureL = ( IGeoFeatureLayer )(0);pUniqueValueR = pTable = ( ITable lfieldNumber = (if( lfieldNumbernew UniqueValueRendererClass ();) m_pGeoFeatureL ;strNameField );= -1)" 未能找到字段"
19、 + strNameField );return ;唯一值著色代碼添加在前面代碼的基礎(chǔ)上添加引用using stdole ;然后添加private voidbtnSymbolRenderer 按鈕的 Click 事件代碼:btnSymbolRenderer_Click ( object sender , EventArgs e)IGeoFeatureLayer pGeoFeatureLayer ;IFeatureLayer pFeatureLayer ;IProportionalSymbolRendererITable pTable ;IQueryFilter pQueryFilter ;IC
20、ursor pCursor ;IFillSymbol pFillSymbol ;pProportionalSymbolR ;ICharacterMarkerSymbol pCharaterMarkerS ;IDataStatisticsIStatisticsResultspDataStatistics ;pStatisticsResult ;= 0;pFontDisp ;IRotationRendererIMap pMap = ;pFeatureLayer = ( pGeoFeatureLayerpRotationRenderer ;IGeoFeatureLayer )(0);= ( IGeo
21、FeatureLayer ) pFeatureLayer ;pTable = ( ITable ) pGeoFeatureLayer ;pQueryFilter"" );new QueryFilterClass ();pCursor = ( pQueryFilter , true );質(zhì)量圖著色代碼添加這里以柱狀圖為例 , 先添加引用如下:然后添加 btnChartRenderer 按鈕的 Click 事件代碼:private void btnChartRenderer_Click ( object sender , EventArgs e) IGeoFeatureLaye
22、r pGeoFeatureL ;IFeatureLayer pFeatureLayer ;ITable pTable ;ICursor pCursor ;IQueryFilter pQueryFilter ;IRowBuffer pRowBuffer ;int numFields = 2;int fieldIndecies = new int numFields ;int lfieldIndex;double dmaxValue ;bool firstValue;double dfieldValue ;IChartRenderer pChartRenderer ;IRendererFields
23、 pRendererFields ;IFillSymbol pFillSymbol ;IMarkerSymbol pMarkerSymbol ;ISymbolArraypSymbolArray ;IChartSymbolpChartSymbol ;簡(jiǎn)單著色代碼添加 添加 btnDotDensityRenderer 按鈕的 Click 事件代碼:private void btnDotDensityRenderer_Click ( object sender , EventArgs e) IGeoFeatureLayer pGeoFeatureL ;IDotDensityRendererpDotD
24、ensityRenderer ;IDotDensityFillSymbol pDotDensityFillS;IRendererFields pRendererFields ;ISymbolArray pSymbolArray ;ISimpleMarkerSymbol pSimpleMarkerS ;string strPopField = "POP1990"IMap pMap = ;pGeoFeatureL = ( IGeoFeatureLayer )(0);pDotDensityRenderer = new DotDensityRendererClass (); pRe
25、ndererFields = ( IRendererFields ) pDotDensityRenderer ; / 添加點(diǎn)密度著色的字段名( strPopField , strPopField ); pDotDensityFillS = new DotDensityFillSymbolClass (); / 設(shè)置著色符號(hào)的大小和顏色= 4;IRgbColor color = new RgbColorClass ();= 0;= 0;= 0;=color ;/ 設(shè)置著色符號(hào)的背景顏色= 239;= 228;= 190;=color ;pSymbolArray = ( ISymbolArray
26、) pDotDensityFillS ;/ 設(shè)置點(diǎn)符號(hào)樣式 pSimpleMarkerS = new SimpleMarkerSymbolClass ();= ;= 4;= 128;= 128;= 255;=color ;( ISymbol ) pSimpleMarkerS );= pDotDensityFillS;/ 設(shè)置一個(gè)點(diǎn)代表的值= 200000;/ 創(chuàng)建圖例();= (IFeatureRenderer ) pDotDensityRenderer ;null , null );著色的效果如下圖所示:圖11根據(jù)POP1990字段的點(diǎn)密度著色圖效果1.5 小結(jié)地圖專(zhuān)題圖制作是GIS 中數(shù)據(jù)
27、顯示和分析的重要環(huán)節(jié),涉及到的對(duì)象和接口也比較多,上面實(shí)例只是簡(jiǎn)單的實(shí)現(xiàn)了五種專(zhuān)題圖的顯示。讀者也可以嘗試在當(dāng)前工程中添加TOCControl 控件,然后在每次專(zhuān)題圖生成代碼的最后添加如下代碼: ) ;();看看 TOCControl 控件中會(huì)有什么樣的變化,如果讀者對(duì)二次開(kāi)發(fā)感興趣,可以自己試著閱讀 GIS 二次開(kāi)發(fā)相關(guān)書(shū)籍,了解與編輯相關(guān)的接口和方法,自己實(shí)現(xiàn)豐富的著色效果。2 網(wǎng)絡(luò)分析在 ArcGIS 中,網(wǎng)絡(luò)是由一組邊和接點(diǎn)按照一定的拓?fù)潢P(guān)系彼此連接而成的,邊是具有一定長(zhǎng)度和物流的網(wǎng)絡(luò)要素, 接點(diǎn)是兩條或兩條以上邊的交匯處, 實(shí)現(xiàn)兩條邊之間的物流的轉(zhuǎn)換, 邊與接點(diǎn)是網(wǎng)絡(luò)的兩類(lèi)基本組成要
28、素。 ArcGIS 所涉及的網(wǎng)絡(luò),是由一系列要素類(lèi)別組成的,可以度量并能夠用圖形形式表達(dá)的網(wǎng)絡(luò),所以又稱(chēng)為幾何網(wǎng)絡(luò)( Geometric Network )。組成幾何網(wǎng)絡(luò)的各要素被限制存在于網(wǎng)絡(luò)中,作為網(wǎng)絡(luò)要素( Network Feature )。 ArcGIS 自動(dòng)維護(hù)幾何網(wǎng)絡(luò)要素之間的基于幾何的一致性拓?fù)潢P(guān)系。 本節(jié)中的網(wǎng)絡(luò)分析包括兩個(gè)模塊, 網(wǎng)絡(luò)生成和進(jìn)行網(wǎng) 絡(luò)分析。本小節(jié)中的網(wǎng)絡(luò)分析是針對(duì)網(wǎng)絡(luò)生成中的數(shù)據(jù)進(jìn)行操作的。路徑與權(quán)重的設(shè)置注意文檔中的”注意”。2.1 生成幾何網(wǎng)絡(luò)在進(jìn)行網(wǎng)絡(luò)分析功能實(shí)現(xiàn)之前,我們需要使用 ArcGIS 來(lái)創(chuàng)建一個(gè)幾何網(wǎng)絡(luò)文件。1) 創(chuàng)建 Geodatabas
29、e 。打開(kāi) ArcCatalog ,在“ GIS 設(shè)計(jì)與開(kāi)發(fā)例子數(shù)據(jù) Network ”文件夾下單擊右鍵, 選擇“ New” , “ Personal Geodatabase ” , 名稱(chēng)設(shè)為“ USA_Highway_Network_GDB” 。2) 創(chuàng)建 Feature Dataset 。 右鍵單擊“ USA_Highway_Network_GDB” , 選擇“New” , “ FeatureDataset ”。在彈出窗口設(shè)置要素?cái)?shù)據(jù)集的名字為“ high ”。在彈出的坐標(biāo)系統(tǒng)設(shè)置界面單擊“ Import ”按鈕,選擇文件“”,即將該文件的坐標(biāo)系統(tǒng)導(dǎo)入到數(shù)據(jù)集中,如圖所示。然后單擊“ Ne
30、xt ”,直到 Finish ,完成要素?cái)?shù)據(jù)集的創(chuàng)建。圖 12 創(chuàng)建 Feature Dataset圖 13 坐標(biāo)系統(tǒng)設(shè)置3) 添加 FeatureClass 。右鍵單擊要素?cái)?shù)據(jù)集“ high ” , 選擇 “ Import ” , “ FeatureClass( Single )”,在彈出對(duì)話框中設(shè)置“ Input Features ”為“”,輸出要素名稱(chēng)為“ high ”,輸 出路徑為默認(rèn)。單擊“OK',完成添加。圖 14 添加 FeatureClass圖 15 輸出設(shè)置4) 創(chuàng)建幾何網(wǎng)絡(luò)。右擊“ high ”數(shù)據(jù)集,選擇“New”,“Geometric Network ”,準(zhǔn)備開(kāi)
31、始生成網(wǎng)絡(luò)。圖 16 創(chuàng)建幾何網(wǎng)絡(luò)進(jìn)入幾何網(wǎng)絡(luò)生成向?qū)?。圖 17 幾何網(wǎng)絡(luò)生成向?qū)нx擇幾何網(wǎng)絡(luò)生成方式,這里選擇根據(jù)已存在要素創(chuàng)建。圖 18 選擇幾何網(wǎng)絡(luò)生成方式選擇生成幾何網(wǎng)絡(luò)的要素,并設(shè)置名稱(chēng),這里保留默認(rèn)名稱(chēng)不做修改。圖 19 選擇生成幾何網(wǎng)絡(luò)的要素選擇幾何網(wǎng)絡(luò)中是否保留原要素的屬性值,這里選擇“Yes”。圖 20 選擇幾何網(wǎng)絡(luò)屬性值選擇網(wǎng)絡(luò)中的邊的類(lèi)型為復(fù)雜邊( complex edges )。所謂復(fù)雜邊,就是在生成網(wǎng)絡(luò)過(guò)程中,不會(huì)因?yàn)楣?jié)點(diǎn)和邊的連接關(guān)系而打斷該邊。 而簡(jiǎn)單邊會(huì)因?yàn)橛兄虚g節(jié)點(diǎn)的存在被分割成為多個(gè)要 素。圖 21 網(wǎng)絡(luò)中的邊的類(lèi)型設(shè)置要素間捕捉半徑,這里設(shè)為。選擇希望被移
32、動(dòng)的要素類(lèi)。在對(duì)數(shù)據(jù)進(jìn)行編輯的過(guò)程中,捕捉功能應(yīng)用減少數(shù)據(jù)修改的麻煩,但要注意,不正確的捕捉半徑設(shè)置會(huì)導(dǎo)致數(shù)據(jù)變形。圖 22 設(shè)置要素間捕捉容差設(shè)置網(wǎng)絡(luò)數(shù)據(jù)的權(quán)重,將Weight Name 設(shè)為“ Length ”,“ Type ”設(shè)為“ Double ”。圖 23 設(shè)置網(wǎng)絡(luò)數(shù)據(jù)的權(quán)重將上一步設(shè)置的權(quán)重名稱(chēng)與要素類(lèi)中的字段關(guān)聯(lián),這里選擇LENGTH。圖 24 權(quán)重字段關(guān)聯(lián)幾何網(wǎng)絡(luò)參數(shù)設(shè)置完成。點(diǎn)擊“ Finish ”即可完成。圖 25 幾何網(wǎng)絡(luò)設(shè)置信息打開(kāi) Catalog 下文件夾,展開(kāi)后創(chuàng)建的文件如下圖所示。圖 26 創(chuàng)建幾何網(wǎng)絡(luò)后的文件通過(guò)以上步驟生成的幾何網(wǎng)絡(luò)指定了 “ high”要素類(lèi)
33、中的“ LENGTH字段作為該幾何網(wǎng)絡(luò)的權(quán)。執(zhí)行程序后,在Personal Geodatabase 中的“ high ”要素集中生成了“ high_NET_Junctions ”接點(diǎn)要素類(lèi)和“ ushigh ”幾何網(wǎng)絡(luò)。2.2 網(wǎng)絡(luò)分析的實(shí)現(xiàn)我們下面動(dòng)手實(shí)現(xiàn)一個(gè)簡(jiǎn)單的最短路徑分析。用戶(hù)通過(guò)在MapControl 點(diǎn)擊選擇路徑經(jīng)過(guò)的節(jié)點(diǎn),雙擊完成節(jié)點(diǎn)的選擇,然后最短路徑會(huì)以紅色線條顯示到 MapControl 中。2.2.1 添加控件新建一個(gè)C傾目,項(xiàng)目名稱(chēng)為 Network ,將Forml的名字設(shè)置為 MainForm , Text屬性設(shè)為 “網(wǎng)絡(luò)分析” 。 并添加、 MapControl 、
34、 TOCControl 、 LicenceControl 三個(gè)控件。 并將 TOCControl 的伙伴控件設(shè)為 MapControl ??丶季中Ч缦聢D所示。圖 27 控件布局效果2.2.2 代碼添加及解釋添加如下引用。using 添加如下成員變量。/ 幾何網(wǎng)絡(luò) private IGeometricNetwork mGeometricNetwork;/ 給定點(diǎn)的集合private IPointCollection mPointCollection;/ 獲取給定點(diǎn)最近的 Network 元素private IPointToEID mPointToEID;/ 返回結(jié)果變量privateIEnu
35、mNetEID mEnumNetEID_Junctions;privateIEnumNetEID mEnumNetEID_Edges;private double mdblPathCost;編寫(xiě)一個(gè)自定義函數(shù),用于實(shí)現(xiàn)路徑分析。在 ArcEngine 中,使用 ITraceFlowSolverGEN接口實(shí)現(xiàn)路徑分析計(jì)算,通過(guò)查詢(xún)接口 INetSolver 獲取幾何網(wǎng)絡(luò)的 Network ,使用 INetFlag 獲 取路徑求解的邊( PutEdgeOrigins ) 或點(diǎn) ( PutJunctionOrigins ) , 最后使用該接口的 FindPath方法執(zhí)行路徑分析。實(shí)現(xiàn)代碼如下:pri
36、vate void SolvePath( string weightName)/ 創(chuàng)建 ITraceFlowSolverGENITraceFlowSolverGEN pTraceFlowSolverGEN = new TraceFlowSolverClass ();INetSolver pNetSolver = pTraceFlowSolverGEN as INetSolver ;/ 初始化用于路徑計(jì)算的 Network INetwork pNetWork = ;= pNetWork;/ 獲取分析經(jīng)過(guò)的點(diǎn)的個(gè)數(shù) int intCount = ;if (intCount < 1) retu
37、rn ;INetFlag pNetFlag;/ 用于存儲(chǔ)路徑計(jì)算得到的邊IEdgeFlag pEdgeFlags = new IEdgeFlag intCount;IPoint pEdgePoint = new PointClass ();int intEdgeEID;IPoint pFoundEdgePoint;double dblEdgePercent;/ 用于獲取幾何網(wǎng)絡(luò)元素的 UserID, UserClassID,UserSubID INetElements pNetElements = pNetWork as INetElements ;int intEdgeUserClassID
38、;int intEdgeUserID;int intEdgeUserSubID;for ( int i = 0; i < intCount; i+)pNetFlag =new EdgeFlagClass ();/ 獲取用戶(hù)點(diǎn)擊點(diǎn)pEdgePoint = (i);/ 獲取距離用戶(hù)點(diǎn)擊點(diǎn)最近的邊(pEdgePoint,out intEdgeEID, out pFoundEdgePoint, out dblEdgePercent);if (intEdgeEID <= 0) continue ;/ 根據(jù)得到的邊查詢(xún)對(duì)應(yīng)的幾何網(wǎng)絡(luò)中的元素UserID, UserClassID,UserSub
39、ID(intEdgeEID, ,out intEdgeUserClassID, out intEdgeUserID, out intEdgeUserSubID);if (intEdgeUserClassID <= 0 | intEdgeUserID <= 0) continue ;= intEdgeUserClassID;= intEdgeUserID;= intEdgeUserSubID;pEdgeFlagsi = pNetFlagas IEdgeFlag ;/ 設(shè)置路徑求解的邊( ref pEdgeFlags);/ 路徑計(jì)算權(quán)重INetSchema pNetSchema = p
40、NetWork as INetSchema;INetWeight pNetWeight = (weightName);if (pNetWeight = null ) return ;/ 設(shè)置權(quán)重,這里雙向的權(quán)重設(shè)為一致INetSolverWeights pNetSolverWeights = pTraceFlowSolverGEN as INetSolverWeights ;= pNetWeight;= pNetWeight;object arrResults = new object intCount - 1;/ 執(zhí)行路徑計(jì)算,out mEnumNetEID_Junctions, out m
41、EnumNetEID_Edges,intCount - 1, ref arrResults);/ 獲取路徑計(jì)算總代價(jià)( cost )mdblPathCost = 0;for ( int i = 0; i < intCount - 1; i+)mdblPathCost += (double )arrResultsi;編寫(xiě)自定義函數(shù),實(shí)現(xiàn)路徑分析結(jié)果到幾何要素的轉(zhuǎn)換,用于地圖的顯示。主要通過(guò)IEIDHelper 接口完成轉(zhuǎn)換,首先使用該接口獲取幾何網(wǎng)絡(luò)和空間參考,然后查詢(xún)組成路徑的幾何要素的信息返回到接口 IEnumEIDInfo 中,最后通過(guò) IEnumEIDInfo 接口獲取要素的幾何要
42、素。代碼如下:private IPolyline PathToPolyLine() IPolyline pPolyLine = new PolylineClass ();IGeometryCollection pNewGeometryCollection = pPolyLine as IGeometryCollection ; if (mEnumNetEID_Edges = null ) return null ;IEIDHelper pEIDHelper = new EIDHelperClass ();/ 獲取幾何網(wǎng)絡(luò)= mGeometricNetwork;/ 獲取地圖空間參考ISpatia
43、lReference pSpatialReference = pSpatialReference;=true ;/根據(jù)邊的ID獲取邊的信息IEnumEIDInfo pEnumEIDInfo = (mEnumNetEID_Edges);int intCount = ;();IEIDInfo pEIDInfo;IGeometry pGeometry;for ( int i = 0; i < intCount;i+ )pEIDInfo = ();/ 獲取邊的幾何要素 pGeometry = ;(IGeometryCollection )pGeometry); return pPolyLine;
44、下面開(kāi)始網(wǎng)絡(luò)分析的實(shí)現(xiàn)。首先是網(wǎng)絡(luò)數(shù)據(jù)的讀取與加載,我們?cè)?MainForm 的 Load 事件 中實(shí)現(xiàn)。此處直接加載我們?cè)谏弦还?jié)自己生成的幾何網(wǎng)絡(luò)數(shù)據(jù),首先獲取工作空間“”,然后獲取其中的要素?cái)?shù)據(jù)集合“ high ”,進(jìn)而得到其中的幾何網(wǎng)絡(luò)數(shù)據(jù)“ high_net ”,使用接口IGeometricNetwork 獲取。然后使用 IFeatureClassContainer 接口獲取幾何網(wǎng)絡(luò)中的要素類(lèi),添加到 MapControl 中。值得注意的是,路徑分析中, IPointToEID 的源地圖和幾何網(wǎng)絡(luò)以及容 差在此完成設(shè)置。代碼如下:private void MainForm_Load(
45、object sender, EventArgs e)/ 獲取幾何網(wǎng)絡(luò)文件路徑/ 注意修改此路徑為當(dāng)前存儲(chǔ)路徑string strPath ="E:GIS設(shè)計(jì)與開(kāi)發(fā)例子數(shù)據(jù)'Network'"/ 打開(kāi)工作空間IWorkspaceFactory pWorkspaceFactory = new AccessWorkspaceFactory ();IFeatureWorkspace pFeatureWorkspace = (strPath, 0) as IFeatureWorkspace ;/ 獲取要素?cái)?shù)據(jù)集/ 注意名稱(chēng)的設(shè)置要與上面創(chuàng)建保持一致IFeatureD
46、ataset pFeatureDataset = ( "high" );/ 獲取network 集合INetworkCollection pNetWorkCollection = pFeatureDataset as INetworkCollection / 獲取network 的數(shù)量, 為零時(shí)返回int intNetworkCount = ;if (intNetworkCount < 1) return ;/FeatureDataset 可能包含多個(gè)network ,我們獲取指定的 network/ 注意 network 的名稱(chēng)的設(shè)置要與上面創(chuàng)建保持一致 mGeom
47、etricNetwork = ("high_net" );/將Network中的每個(gè)要素類(lèi)作為一個(gè)圖層加入地圖控件IFeatureClassContainer pFeatClsContainer = mGeometricNetwork as IFeatureClassContainer ;/ 獲取要素類(lèi)數(shù)量,為零時(shí)返回int intFeatClsCount=;if (intFeatClsCount < 1) return ;IFeatureClass pFeatureClass;IFeatureLayer pFeatureLayer;for ( int i = 0;
48、i < intFeatClsCount;i+ )/ 獲取要素類(lèi) pFeatureClass = (i); pFeatureLayer =new FeatureLayerClass ();= pFeatureClass;= ;/ 加入地圖控件0);/ 計(jì)算 snap tolerance 為圖層最大寬度的 1/100/ 獲取圖層數(shù)量int intLayerCount=IGeoDataset pGeoDataset;IEnvelope pMaxEnvelope= new EnvelopeClass ();for ( int i = 0; i < intLayerCount;i+ )/ 獲
49、取圖層pFeatureLayer =as IFeatureLayer ;pGeoDataset = pFeatureLayeras IGeoDataset ;/ 通過(guò) Union 獲得較大圖層范圍double dblWidth = ;double dblHeight = ;double dblSnapTol;if (dblHeight < dblWidth)dblSnapTol = dblWidth * ;elsedblSnapTol = dblHeight * ;/ 設(shè)置源地圖,幾何網(wǎng)絡(luò)以及捕捉容差mPointToEID =new PointToEIDClass ();= mGeometricNetwork;= dblSnapTol;下面添加 MapControl的OnMouseDowrW件,完成用戶(hù)單擊時(shí)的響應(yīng)。用戶(hù)單擊時(shí)獲取用戶(hù) 單擊的點(diǎn),并存儲(chǔ)到點(diǎn)集中。private void axMapControl1_OnMouseDown( objec
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 投資合作協(xié)議樣本
- 東風(fēng)商用車(chē)合作協(xié)議
- 2025版土地整治項(xiàng)目土地承包協(xié)議3篇
- 2025年西安建工園林工程有限公司招聘筆試參考題庫(kù)含答案解析
- 2025年度個(gè)人二手房交易合同模板綠色環(huán)保型2篇
- 2025年度定制化個(gè)人購(gòu)房合同范本2篇
- 2025年全球及中國(guó)氣動(dòng)式高壓無(wú)氣噴涂機(jī)行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025版?zhèn)€人退股協(xié)議書(shū):私募股權(quán)退出及收益分配合同4篇
- 2024年教師資格之中學(xué)綜合素質(zhì)模擬題庫(kù)及答案
- 2025年個(gè)人二手車(chē)買(mǎi)賣(mài)合同(帶車(chē)輛狀況認(rèn)證服務(wù))
- 2025貴州貴陽(yáng)市屬事業(yè)單位招聘筆試和高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2024年住院醫(yī)師規(guī)范化培訓(xùn)師資培訓(xùn)理論考試試題
- 期末綜合測(cè)試卷(試題)-2024-2025學(xué)年五年級(jí)上冊(cè)數(shù)學(xué)人教版
- 招標(biāo)采購(gòu)基礎(chǔ)知識(shí)培訓(xùn)
- 2024年廣東省公務(wù)員錄用考試《行測(cè)》試題及答案解析
- 五年級(jí)口算題卡每天100題帶答案
- 結(jié)構(gòu)力學(xué)本構(gòu)模型:斷裂力學(xué)模型:斷裂力學(xué)實(shí)驗(yàn)技術(shù)教程
- 2024年貴州省中考理科綜合試卷(含答案)
- 無(wú)人機(jī)技術(shù)與遙感
- 恩施自治州建始東升煤礦有限責(zé)任公司東升煤礦礦產(chǎn)資源開(kāi)發(fā)利用與生態(tài)復(fù)綠方案
- PDCA提高臥床患者踝泵運(yùn)動(dòng)的執(zhí)行率
評(píng)論
0/150
提交評(píng)論