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

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,並把鎖文件也解掉。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章