ArcObjects SDK開發 024開發的技術和技巧

mytudousi發表於2022-12-26

1、基本技術

開發方面。會使用C#開發語言和Visual Studio開發工具。會使用WinForm或者WPF開發。

理論知識方面。瞭解GIS的相關概念,例如向量資料,柵格資料,空間參考、比例尺等概念。

工具方面。能夠較為熟練的使用ArcMap桌面軟體。

2、物件導向程式設計

如果我們只用.Net開發一個普通的應用的話,我們是否理解和掌握物件導向並不是那麼重要。.Net的學習曲線比較緩,新手很容易上手,並開發出應用,但想要提高還是有些難度的。而ArcObjects是一個非常嚴謹的物件導向類庫,沒有考慮學習曲線和成本的問題,所有的介面和類的定義都正常設計的。

做ArcObejcts SDK開發的時候,我們一定要理解介面轉換。例如我們做一個開啟Mxd檔案,獲取某個圖層範圍的功能,應該怎麼做呢?

先使用IMapDocument介面,開啟Mxd檔案,例項化的時候,需要例項化MapDocumentClass。

透過IMapDocument介面獲取當前啟用的IMap例項。

透過IMap例項獲取指定的ILayer例項。

接下來我們要透過ILayer獲取該圖層的範圍。

此時就遇到問題了,我們可以去幫助查下ILayer的定義,該介面是沒有定義類似範圍這樣的屬性的。我們可以先看下有哪些類繼承ILayer,然後找到最熟悉的類,例如FeatureLayer和RasterLayer,看看其繼承了哪些共同的介面,而這個介面又能得到範圍資訊。

這樣我們就很容易找到了IGeoDataset介面,該介面有Extent屬性定義,該屬性返回IEnvelope例項,這個屬性就是我們需要的了。

最後,我們還可以檢視下IGeoDataset介面,看看是不是我們常用的圖層都繼承了這個介面。確認後,我們就可以寫程式碼了。

ILayer myLayer=myMap. get_Layer(0);
IGeoDataset myGeoDataset= myLayer as IGeoDataset;
If (myGeoDataset!=null)
{
   return myGeoDataset. Extent;
}

為了防止某個繼承ILayer的類,並沒有繼承IGeoDataset,可以加一個是否為null的判斷。這個就是典型的ArcObjects SDK開發的時候的介面轉換。

3、和ArcMap配合開發

在做一個功能之前如果不清楚,可以先使用ArcMap去測試,測試到滿意的效果之後,再去開發。例如在向量圖層上顯示文字標註,設定比例尺樣式等,都可以在ArcMap操作後,知道應該去設定哪些引數,這些引數都設定成什麼值,然後再去寫程式碼。

如果一個功能用ArcMap都沒有做出來,就是呼叫ArcObject SDK去實現,很難找到思路和突破口。例如向量圖層文字標註的時候,設定文字標註的位置,一般情況下,我們是沒什麼要求的,都是按照預設引數標註。但如果要求標註到正上方呢?並且如果是線,沿著線的方向標註呢?這時,我們就可以去ArcMap裡面操作,把想要的效果做出來,如下圖所示。

image1.png

可以多次嘗試各種引數設定的效果,知道滿意為止,把引數記錄下來,在程式碼裡面實現。

4、善於使用幫助

幫助中介面與類之間的關係定義的非常清楚,這在我們進行介面轉換的時候幫助非常大。而且有些複雜的概念,幫助中會有詳細的解釋說明,甚至包含配圖以及例子程式碼。如果一個問題網上有多種說法,記得自己可以在幫助中去找下有沒有相關的說明,幫助中解釋說明是最準確的。

當對ArcObject SDK稍微有些熟悉的時候,可以去看下每個名稱空間中的介面類關係圖,直觀的瞭解各介面類之間的關係,以及還有哪些有用自己卻沒怎麼注意到的介面和類。這些圖可以在幫助的左側樹種找到,也可以直接去SDK的安裝目錄下找,路徑位C:\Program Files (x86)\ArcGIS\DeveloperKit10.8\Diagrams。

SDK安裝後,在C:\Program Files (x86)\ArcGIS\DeveloperKit10.8\Samples\arcobjects-sdk-community-samples-master.zip中包含了很多ArcObject SDK的例子工程,裡面的程式碼都可以開啟參考和學習。

SDK安裝後,會有一個C:\Program Files (x86)\ArcGIS\DeveloperKit10.8 \Icons\ArcObjects_Icons.zip檔案,這個檔案包含了很多ArcGIS使用的圖示。我們自己開發系統的時候,可以使用裡面的圖示。

5、呼叫Toolbox中Tool的技巧

如向量資料、柵格資料作為引數的時候,儘量傳檔案路徑,而不是物件;

每調一個ToolBox的時候,都要去捕捉錯誤資訊,並丟擲來,不然模型執行中止,不知道到底是哪出的問題;

引數計算的檔名儘量不要包含漢字字元,並且檔名儘量以字母開頭;

生成的結果檔案儘量都儲存成shp、tif或者img等檔案,如果需要儲存到其他資料來源中,再呼叫程式碼複製過去即可。

如果不知道Toolbox的引數該如何設定,那麼就在ArcMap裡面執行一遍,複製Py程式碼,看py程式碼中如何設定的,按照其設定即可。

如果程式碼中呼叫某個Toolbox報錯,可以用同樣的資料和引數在ArcMap裡面執行一遍,看到底是哪錯誤了。調整資料來源格式或者引數,執行成功後,再去修改程式碼。

6、可以深入理解一些原理

一些概念,我們可以更深入的理解一下。例如水系追蹤,包含了很多步驟,非常固定,大多數人不管用ArcMap做,還是用Arcpy或者基於ArcObjects開發,都是那麼幾個步驟。但每個步驟的意義是什麼?為什麼要這麼做?這些問題可能有很人多說不清。

例如設定匯流量值的時候,這個值代表什麼意義?如果大家是專門研究這個方向的,就可以去知乎、bilibili或者一些公眾號去看下一些人寫的文章或者錄得影片。

我之前做了一個透過DEM生成水系的功能,匯流量設定的時候,就設定一個數字,沒單位,也不知道其意義。透過一篇文章我才明白怎麼回事。

image2.png

https://blog.csdn.net/liyuanxiang1984/article/details/73863609?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%2273863609%22%2C%22source%22%3A%22mytudousi%22%7D&ctrtid=mAS91

後來我就修改了水系生成介面,把設定最小匯流量的地方設定成了平方公里,這樣就容易理解了。

image3.png

同理,大家在做自己業務模型的時候,可以多去這些地方看下別人寫的深入分析相關內容的文章,會有很大的收穫。

7、需要注意的其他問題

1、ArcMap和ArcObjects SDK都是32位的,所以開發的程式只能編譯成32位。

2、注意記憶體洩漏問題,例如查詢獲取的IFeatureCursor等,需要釋放。

3、開啟一個Shape檔案後,系統後生成一個鎖檔案,不需要這個資料需要釋放掉FeatureClass,並把鎖檔案也解掉。

相關文章