![ArcGISEngine二次開發(fā)提高篇_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-4/25/bee604bc-22c8-4795-808c-bf0391ae370c/bee604bc-22c8-4795-808c-bf0391ae370c1.gif)
![ArcGISEngine二次開發(fā)提高篇_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-4/25/bee604bc-22c8-4795-808c-bf0391ae370c/bee604bc-22c8-4795-808c-bf0391ae370c2.gif)
![ArcGISEngine二次開發(fā)提高篇_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-4/25/bee604bc-22c8-4795-808c-bf0391ae370c/bee604bc-22c8-4795-808c-bf0391ae370c3.gif)
![ArcGISEngine二次開發(fā)提高篇_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-4/25/bee604bc-22c8-4795-808c-bf0391ae370c/bee604bc-22c8-4795-808c-bf0391ae370c4.gif)
![ArcGISEngine二次開發(fā)提高篇_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-4/25/bee604bc-22c8-4795-808c-bf0391ae370c/bee604bc-22c8-4795-808c-bf0391ae370c5.gif)
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、ArcGIS Engine 二次開發(fā)提高篇1縮略圖(鷹眼)鷹眼功能是GIS的主要功能之一,當(dāng)?shù)貓D范圍很大時,它可以很好的為用戶指明當(dāng)前地圖的范圍。在本小節(jié)中我們將學(xué)習(xí)如何制作這種鷹眼。1.1 添加控件新建一個 C#.Net項目,項目名稱為 OverView,將Forml的名字設(shè)置為 MainForm ,并添加 ToolbarControl 、兩個 MapControl和LicenceControl等四個控件。布局如下圖所示。左邊的axMapControll用于地圖數(shù)據(jù)顯示和操作,右邊 axMapControl2用于鷹眼顯示。圖1界面布局在ToolbarControl加載添加數(shù)據(jù)按鈕和地圖瀏覽的
2、功能按鈕,如下圖所示,并將ToolbarControl的伙伴控件設(shè)為 axMapControl1。圖2添加按鈕1.2 代碼添加及解釋鷹眼用來顯示主窗體當(dāng)前視圖范圍在全景視圖中的位置,在ArcMap中使用一個線框在鷹眼視圖中標(biāo)識。當(dāng)主視圖中的視圖范圍改變時,鷹眼中的線框隨之改變, 當(dāng)拖動鷹眼視圖中的紅線框時,主視圖中的視圖范圍也隨之改變。下面開始實現(xiàn)鷹眼功能,添加、三個引用。首先在axMapControl1中視圖范圍改變時鷹眼窗體要做出對應(yīng)的響應(yīng),即繪制線框并顯示,在 OnExtentUpdated 事件中添加代碼如下:private void axMapControl1_OnExtentUpd
3、ated( object sender, e)et項目,項目名稱為Buffer ,將Form1的名字設(shè)置為 MainForm ,并添加ToolbarControl 、MapControl、TOCControl、LicenceControl 和 Button 等五個控件。并將 ToolbarControl 、TOCControl 的伙伴控件設(shè)為 MapControl , Button 控件的 Name屬性設(shè)定為 btnBuffer , Text屬性設(shè)定為"緩沖區(qū)分析”。控件布局效果如下圖所示。圖3控件布局效果在ToolbarControl加載添加數(shù)據(jù)按鈕和地圖瀏覽的功能按鈕,如下圖所示
4、。圖4添加按鈕1.2.1 代碼添加及解釋首先添加如下四個命名空間的引用。在使用Geoprocessor工具實現(xiàn)緩沖區(qū)分析時,需要首先定義一個Geoprocessor對象,因為命名空間”也包含Geoprocessor類,為了避免混淆,我們使用命名空間來定義Geoprocessor ,然后設(shè)置Geoprocessor中的環(huán)境參數(shù),這里我們使用默認(rèn)參數(shù)。然后定義一個操作類 Buffer ,并設(shè)置 參數(shù),生成緩沖區(qū)的參數(shù)包含原始圖層,緩沖半徑和輸出路徑,最后使用已定義的 Geoprocessor對象執(zhí)行即可。雙擊“生成緩存區(qū)”按鈕,添加代碼如下:private void btnBuffer_Click
5、( object sender, EventArgs e)hp)|*.shp" hp" !=("輸出路徑錯誤!");return ; et項目,項目名稱為OverLay ,將Forml的名字設(shè)置為 MainForm,并添加ToolbarControl 、MapControl、TOCControl、LicenceControl 和 Button 等五個控件。并將 ToolbarControl 、TOCControl 的伙伴控件設(shè)為MapControl , Button 控件的 Name屬性設(shè)定為btnIntersect , Text屬性設(shè)定為"疊
6、置求交"??丶季中Ч缦聢D所示。圖5控件布局效果在ToolbarControl加載添加數(shù)據(jù)按鈕和地圖瀏覽的功能按鈕,如下圖所示圖6添加按鈕1.2.2 代碼添加及解釋首先添加如下引用:using與緩沖區(qū)分析的實現(xiàn)類似,在使用 Geoprocessor工具實現(xiàn)疊置分析時,需要首先定義一個 Geoprocessor對象,因為命名空間” 也包含Geoprocessor類,為了避免混淆,我們使用命 名空間來定義Geoprocessor ,然后設(shè)置Geoprocessor中的環(huán)境參數(shù),這里我們使用默認(rèn)參數(shù)。然 后定義一個操作類,這里為 Intersect ,然后設(shè)置其操作參數(shù),這里我們僅設(shè)置輸
7、入的要素,最 后使用已定義的 Geoprocessor對象執(zhí)行即可。雙擊“生成緩存區(qū)”按鈕,添加代碼如下:private void btnIntersect_Click( object sender, EventArgs e)hp)|*.shp"="選擇第一個要素"hp)|*.shp""選擇第二個要素"hp)|*.shp" hp"string strName = (index);Unionet項目,項目名稱為 OverLay ,將Form1的名字設(shè)置為 MainForm , Text 屬性設(shè)為"地圖編輯”
8、,并添力口ToolbarControl 、MapControl、TOCControl、LicenceControl四個Button、兩個 ComboBox兩個 Label和一個 GroupBox等控件。將 ToolbarControl 、TOCControl 的伙伴控件設(shè)為 MapControl , ToolbarControl 加載添加 數(shù)據(jù)按鈕和地圖瀏覽的功能按鈕??丶季中Ч缦聢D所示。圖7界面效果控件屬性設(shè)置如下:表1控件屬性設(shè)置控件類型Name屬性Text屬性控件說明Label選擇圖層:Label編輯任務(wù):ComboBoxcboLayersMapControl中的圖層ComboBox
9、cboTasks編輯的方式ButtonbtnRefreshLayers更新圖層cboLayers載入圖層名稱ButtonbtnStartEditing開始編輯開始編輯狀態(tài)ButtonbtnSave保存保存編輯ButtonbtnStopEditing結(jié)束編輯結(jié)束編輯狀態(tài)GroupBox地圖編輯控件容器1.3 添加引用和代碼ArcEngine中的地圖編輯使用 的工作空間進(jìn)行編輯時,首先使用 StartEditing方法開始編輯狀態(tài),IWorkspaceEdit接口來進(jìn)行編輯狀態(tài)的管理,在需要對指定IWorkspaceEdit獲取該工作空間的數(shù)據(jù),然后使用StartEditOperation使用St
10、opEditOperation方法關(guān)閉編輯操作,使用方法打開具體編輯的操作,編輯完成后,StopEditing 方法關(guān)閉編輯狀態(tài),完成編輯。涉及到了比較復(fù)雜的鼠標(biāo)與地在本例中,我們實現(xiàn)了新的點(diǎn)線面要素的創(chuàng)建和移動的功能,圖間的交互,這個功能的實現(xiàn)中,IDisplayFeedback是一個十分關(guān)鍵的接口,它具有涉及創(chuàng)建要素,移動要素、編輯節(jié)點(diǎn)等31個實現(xiàn)類,能夠?qū)崿F(xiàn)鼠標(biāo)與地圖交互中的事件的追蹤,返回新的幾何對象。本例的實現(xiàn),我們首先來添加一個編輯類,將涉及到的編輯的相關(guān)方法抽象到這個類中。項目中添加“ Edit ”類。添加如下引用。using定義如下成員變量。orkspace;private b
11、ool misEditing;mWorkspaceEdit = pWorkspaceas IWorkspaceEdit ;if (mWorkspaceEdit = null ) return ;creenDisplay;pNewLineFeedback = mDisplayFeedbackas INewLineFeedback ;creenDisplay;pNewPolygonFeedback = mDisplayFeedbackas INewPolygonFeedback ;creenDisplay;et項目,項目名稱為MapRender,將Forml的名字設(shè)置為 MainForm,并添加
12、ToolbarControl 、MapControl、TOCControl、LicenceControl 和 Button 等五個控件。并將 ToolbarControl 、TOCControl的伙伴控件設(shè)為 MapControl。控件布局效果如下圖所示。圖8控件布局效果在ToolbarControl加載添加數(shù)據(jù)按鈕和地圖瀏覽的功能按鈕,如下圖所示。圖9工具欄設(shè)置效果添加Buttom按鈕的屬性設(shè)置如下:表4控件屬性設(shè)置控件類 型Name屬性Text屬性控件說明ButtonbtnSimpIeRenderer簡單著色對圖層簡單著色ButtonbtnCIassBreakRenderer分級著色對圖層
13、分級著色ButtonbtnUniqueValueRenderer唯一值著色對圖層唯一值著色ButtonbtnSymbolRenderer依比例符號著色對圖層依比例符號著色ButtonbtnChartRenderer質(zhì)量圖著色對圖層質(zhì)量圖著色ButtonbtnDotDensityRenderer點(diǎn)密度著色對圖層點(diǎn)密度著色1.4 代碼添加及解釋該工程需要添加如下引用:using usingusing usingusing在axMapControll控件中添加圖層,如圖所示:圖10添加初始化圖層1.簡單著色代碼添加添力口 btnSimpieRenderer 按鈕的Click事件代碼:private
14、void btnSimpIeRenderer_Click (object sender , EventArgs e) IMap pMap =;分級著色代碼添加在前面代碼的基礎(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 這個借口定義的對象才能實現(xiàn)分級。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 ;簡單著色代碼添加 添加 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è)置著色符號的大小和顏色= 4;IRgbColor color = new RgbColorClass ();= 0;= 0;= 0;=color ;/ 設(shè)置著色符號的背景顏色= 239;= 228;= 190;=color ;pSymbolArray = ( ISymbolArray
26、) pDotDensityFillS ;/ 設(shè)置點(diǎn)符號樣式 pSimpleMarkerS = new SimpleMarkerSymbolClass ();= ;= 4;= 128;= 128;= 255;=color ;( ISymbol ) pSimpleMarkerS );= pDotDensityFillS;/ 設(shè)置一個點(diǎn)代表的值= 200000;/ 創(chuàng)建圖例();= (IFeatureRenderer ) pDotDensityRenderer ;null , null );著色的效果如下圖所示:圖11根據(jù)POP1990字段的點(diǎn)密度著色圖效果1.5 小結(jié)地圖專題圖制作是GIS 中數(shù)據(jù)
27、顯示和分析的重要環(huán)節(jié),涉及到的對象和接口也比較多,上面實例只是簡單的實現(xiàn)了五種專題圖的顯示。讀者也可以嘗試在當(dāng)前工程中添加TOCControl 控件,然后在每次專題圖生成代碼的最后添加如下代碼: ) ;();看看 TOCControl 控件中會有什么樣的變化,如果讀者對二次開發(fā)感興趣,可以自己試著閱讀 GIS 二次開發(fā)相關(guān)書籍,了解與編輯相關(guān)的接口和方法,自己實現(xiàn)豐富的著色效果。2 網(wǎng)絡(luò)分析在 ArcGIS 中,網(wǎng)絡(luò)是由一組邊和接點(diǎn)按照一定的拓?fù)潢P(guān)系彼此連接而成的,邊是具有一定長度和物流的網(wǎng)絡(luò)要素, 接點(diǎn)是兩條或兩條以上邊的交匯處, 實現(xiàn)兩條邊之間的物流的轉(zhuǎn)換, 邊與接點(diǎn)是網(wǎng)絡(luò)的兩類基本組成要
28、素。 ArcGIS 所涉及的網(wǎng)絡(luò),是由一系列要素類別組成的,可以度量并能夠用圖形形式表達(dá)的網(wǎng)絡(luò),所以又稱為幾何網(wǎng)絡(luò)( Geometric Network )。組成幾何網(wǎng)絡(luò)的各要素被限制存在于網(wǎng)絡(luò)中,作為網(wǎng)絡(luò)要素( Network Feature )。 ArcGIS 自動維護(hù)幾何網(wǎng)絡(luò)要素之間的基于幾何的一致性拓?fù)潢P(guān)系。 本節(jié)中的網(wǎng)絡(luò)分析包括兩個模塊, 網(wǎng)絡(luò)生成和進(jìn)行網(wǎng) 絡(luò)分析。本小節(jié)中的網(wǎng)絡(luò)分析是針對網(wǎng)絡(luò)生成中的數(shù)據(jù)進(jìn)行操作的。路徑與權(quán)重的設(shè)置注意文檔中的”注意”。2.1 生成幾何網(wǎng)絡(luò)在進(jìn)行網(wǎng)絡(luò)分析功能實現(xiàn)之前,我們需要使用 ArcGIS 來創(chuàng)建一個幾何網(wǎng)絡(luò)文件。1) 創(chuàng)建 Geodatabas
29、e 。打開 ArcCatalog ,在“ GIS 設(shè)計與開發(fā)例子數(shù)據(jù) Network ”文件夾下單擊右鍵, 選擇“ New” , “ Personal Geodatabase ” , 名稱設(shè)為“ USA_Highway_Network_GDB” 。2) 創(chuàng)建 Feature Dataset 。 右鍵單擊“ USA_Highway_Network_GDB” , 選擇“New” , “ FeatureDataset ”。在彈出窗口設(shè)置要素數(shù)據(jù)集的名字為“ high ”。在彈出的坐標(biāo)系統(tǒng)設(shè)置界面單擊“ Import ”按鈕,選擇文件“”,即將該文件的坐標(biāo)系統(tǒng)導(dǎo)入到數(shù)據(jù)集中,如圖所示。然后單擊“ Ne
30、xt ”,直到 Finish ,完成要素數(shù)據(jù)集的創(chuàng)建。圖 12 創(chuàng)建 Feature Dataset圖 13 坐標(biāo)系統(tǒng)設(shè)置3) 添加 FeatureClass 。右鍵單擊要素數(shù)據(jù)集“ high ” , 選擇 “ Import ” , “ FeatureClass( Single )”,在彈出對話框中設(shè)置“ Input Features ”為“”,輸出要素名稱為“ high ”,輸 出路徑為默認(rèn)。單擊“OK',完成添加。圖 14 添加 FeatureClass圖 15 輸出設(shè)置4) 創(chuàng)建幾何網(wǎng)絡(luò)。右擊“ high ”數(shù)據(jù)集,選擇“New”,“Geometric Network ”,準(zhǔn)備開
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è)置名稱,這里保留默認(rèn)名稱不做修改。圖 19 選擇生成幾何網(wǎng)絡(luò)的要素選擇幾何網(wǎng)絡(luò)中是否保留原要素的屬性值,這里選擇“Yes”。圖 20 選擇幾何網(wǎng)絡(luò)屬性值選擇網(wǎng)絡(luò)中的邊的類型為復(fù)雜邊( complex edges )。所謂復(fù)雜邊,就是在生成網(wǎng)絡(luò)過程中,不會因為節(jié)點(diǎn)和邊的連接關(guān)系而打斷該邊。 而簡單邊會因為有中間節(jié)點(diǎn)的存在被分割成為多個要 素。圖 21 網(wǎng)絡(luò)中的邊的類型設(shè)置要素間捕捉半徑,這里設(shè)為。選擇希望被移
32、動的要素類。在對數(shù)據(jù)進(jìn)行編輯的過程中,捕捉功能應(yīng)用減少數(shù)據(jù)修改的麻煩,但要注意,不正確的捕捉半徑設(shè)置會導(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)重名稱與要素類中的字段關(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è)置信息打開 Catalog 下文件夾,展開后創(chuàng)建的文件如下圖所示。圖 26 創(chuàng)建幾何網(wǎng)絡(luò)后的文件通過以上步驟生成的幾何網(wǎng)絡(luò)指定了 “ high”要素類
33、中的“ LENGTH字段作為該幾何網(wǎng)絡(luò)的權(quán)。執(zhí)行程序后,在Personal Geodatabase 中的“ high ”要素集中生成了“ high_NET_Junctions ”接點(diǎn)要素類和“ ushigh ”幾何網(wǎng)絡(luò)。2.2 網(wǎng)絡(luò)分析的實現(xiàn)我們下面動手實現(xiàn)一個簡單的最短路徑分析。用戶通過在MapControl 點(diǎn)擊選擇路徑經(jīng)過的節(jié)點(diǎn),雙擊完成節(jié)點(diǎn)的選擇,然后最短路徑會以紅色線條顯示到 MapControl 中。2.2.1 添加控件新建一個C傾目,項目名稱為 Network ,將Forml的名字設(shè)置為 MainForm , Text屬性設(shè)為 “網(wǎng)絡(luò)分析” 。 并添加、 MapControl 、
34、 TOCControl 、 LicenceControl 三個控件。 并將 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;編寫一個自定義函數(shù),用于實現(xiàn)路徑分析。在 ArcEngine 中,使用 ITraceFlowSolverGEN接口實現(xiàn)路徑分析計算,通過查詢接口 INetSolver 獲取幾何網(wǎng)絡(luò)的 Network ,使用 INetFlag 獲 取路徑求解的邊( PutEdgeOrigins ) 或點(diǎn) ( PutJunctionOrigins ) , 最后使用該接口的 FindPath方法執(zhí)行路徑分析。實現(xiàn)代碼如下:pri
36、vate void SolvePath( string weightName)/ 創(chuàng)建 ITraceFlowSolverGENITraceFlowSolverGEN pTraceFlowSolverGEN = new TraceFlowSolverClass ();INetSolver pNetSolver = pTraceFlowSolverGEN as INetSolver ;/ 初始化用于路徑計算的 Network INetwork pNetWork = ;= pNetWork;/ 獲取分析經(jīng)過的點(diǎn)的個數(shù) int intCount = ;if (intCount < 1) retu
37、rn ;INetFlag pNetFlag;/ 用于存儲路徑計算得到的邊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 ();/ 獲取用戶點(diǎn)擊點(diǎn)pEdgePoint = (i);/ 獲取距離用戶點(diǎn)擊點(diǎn)最近的邊(pEdgePoint,out intEdgeEID, out pFoundEdgePoint, out dblEdgePercent);if (intEdgeEID <= 0) continue ;/ 根據(jù)得到的邊查詢對應(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);/ 路徑計算權(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í)行路徑計算,out mEnumNetEID_Junctions, out m
41、EnumNetEID_Edges,intCount - 1, ref arrResults);/ 獲取路徑計算總代價( cost )mdblPathCost = 0;for ( int i = 0; i < intCount - 1; i+)mdblPathCost += (double )arrResultsi;編寫自定義函數(shù),實現(xiàn)路徑分析結(jié)果到幾何要素的轉(zhuǎn)換,用于地圖的顯示。主要通過IEIDHelper 接口完成轉(zhuǎn)換,首先使用該接口獲取幾何網(wǎng)絡(luò)和空間參考,然后查詢組成路徑的幾何要素的信息返回到接口 IEnumEIDInfo 中,最后通過 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、下面開始網(wǎng)絡(luò)分析的實現(xiàn)。首先是網(wǎng)絡(luò)數(shù)據(jù)的讀取與加載,我們在 MainForm 的 Load 事件 中實現(xiàn)。此處直接加載我們在上一節(jié)自己生成的幾何網(wǎng)絡(luò)數(shù)據(jù),首先獲取工作空間“”,然后獲取其中的要素數(shù)據(jù)集合“ high ”,進(jìn)而得到其中的幾何網(wǎng)絡(luò)數(shù)據(jù)“ high_net ”,使用接口IGeometricNetwork 獲取。然后使用 IFeatureClassContainer 接口獲取幾何網(wǎng)絡(luò)中的要素類,添加到 MapControl 中。值得注意的是,路徑分析中, IPointToEID 的源地圖和幾何網(wǎng)絡(luò)以及容 差在此完成設(shè)置。代碼如下:private void MainForm_Load(
45、object sender, EventArgs e)/ 獲取幾何網(wǎng)絡(luò)文件路徑/ 注意修改此路徑為當(dāng)前存儲路徑string strPath ="E:GIS設(shè)計與開發(fā)例子數(shù)據(jù)'Network'"/ 打開工作空間IWorkspaceFactory pWorkspaceFactory = new AccessWorkspaceFactory ();IFeatureWorkspace pFeatureWorkspace = (strPath, 0) as IFeatureWorkspace ;/ 獲取要素數(shù)據(jù)集/ 注意名稱的設(shè)置要與上面創(chuàng)建保持一致IFeatureD
46、ataset pFeatureDataset = ( "high" );/ 獲取network 集合INetworkCollection pNetWorkCollection = pFeatureDataset as INetworkCollection / 獲取network 的數(shù)量, 為零時返回int intNetworkCount = ;if (intNetworkCount < 1) return ;/FeatureDataset 可能包含多個network ,我們獲取指定的 network/ 注意 network 的名稱的設(shè)置要與上面創(chuàng)建保持一致 mGeom
47、etricNetwork = ("high_net" );/將Network中的每個要素類作為一個圖層加入地圖控件IFeatureClassContainer pFeatClsContainer = mGeometricNetwork as IFeatureClassContainer ;/ 獲取要素類數(shù)量,為零時返回int intFeatClsCount=;if (intFeatClsCount < 1) return ;IFeatureClass pFeatureClass;IFeatureLayer pFeatureLayer;for ( int i = 0;
48、i < intFeatClsCount;i+ )/ 獲取要素類 pFeatureClass = (i); pFeatureLayer =new FeatureLayerClass ();= pFeatureClass;= ;/ 加入地圖控件0);/ 計算 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 ;/ 通過 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件,完成用戶單擊時的響應(yīng)。用戶單擊時獲取用戶 單擊的點(diǎn),并存儲到點(diǎn)集中。private void axMapControl1_OnMouseDown( objec
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年制動帶項目可行性研究報告
- 別墅房屋轉(zhuǎn)讓合同范本
- 產(chǎn)品訂購合同范本模板
- 凈化工程合同范本
- 企業(yè)食堂經(jīng)營合同范本
- 如何推動專家型校長的成長
- 農(nóng)村屋瓦收購合同范本
- 買汽車有合同范本
- 使用權(quán)銷售合同范例
- 2025年度智能農(nóng)業(yè)管理系統(tǒng)開發(fā)與應(yīng)用合同
- 2025年春季學(xué)期學(xué)校德育工作計劃安排表(完整版)
- 2025年有機(jī)肥行業(yè)發(fā)展趨勢分析報告
- 中央2025年中國文聯(lián)所屬單位招聘14人筆試歷年參考題庫附帶答案詳解
- 學(xué)生作文稿紙(A4打印)
- 小學(xué)思政培訓(xùn)
- 《森林火災(zāi)預(yù)防與撲救技術(shù)課件教程》
- 2024美團(tuán)共享出行加盟合同
- 2024年人教版初中英語九年級全冊單元測評與答案
- 永州市2025屆高三高考第二次模擬考試(二模)語文試卷(含答案)
- 國學(xué)智慧與健康幸福人生(課件)
- 【渞法】學(xué)會自我保護(hù)教學(xué)設(shè)計 七年級道德與法治下冊(統(tǒng)編版2024)
評論
0/150
提交評論