寫論文查了很多TIN的接口和屬性,特此來記錄一下。
轉載請注明出處:部落格園@秋意正寒,B站同名。
未完待續
1. Tin資料集在ArcGIS中的描述
Tin資料集在磁盤中,被ArcGIS以檔案夾形式管理。Tin資料集比較特殊,點、線、三角面根據一定拓撲關系組成,與栅格資料集(一張影像)、一個Shapefile平級。暫且不管其在代碼層結構如何,總之,它就在硬碟裡長得跟普通的檔案夾是一樣的,并且奇怪的是,其命名隻支援小寫(在ArcMap中)。
// 補充一下,超圖、MapGIS、QGIS等軟體不知道對Tin資料的組織如何,但是除卻公認的一些矢量格式(dwg、shp等)和一些公認的栅格格式(tif等),用檔案夾組織進階别的資料集是一種折中的解決方案,當然,我本人尚未查閱OGC标準...
2. Tin資料集在ArcObjects中的描述
有關資料和資料庫的部分,當然是Geodatabase類庫了。
Tin資料集在AO中由Tin類(或TinClass類)組織,由ITinWorkspace接口打開現有Tin資料集(但是建立卻不是這個東西建立,與IFeatureWorkspace不同)。
3. AO/AE中Tin資料集的常用接口
- IWorkspaceFactory
- ITinWorkspace
- ITin、ITinEdit、ITinSurface及更新接口、ITinAdvanced及更新接口
- ITinNode、ITinTriangle、ITinEdge
- ITinFeatureEdit
以下逐一進行簡單介紹。
4. 一些案例
4.1 打開Tin
IWorkspaceFactory workspaceFactory = new TinWorkspaceFactoryClass();
// 工作空間工廠的OpenFromFile()方法的第一個參數需要注意,如果是gdb則具體寫到gdb的全名
ITinWorkspace tinWorkspace = workspaceFactory.OpenFromFile(@"Tin資料集所在的檔案夾", 0) as ITinWorkspace;
ITin tin = tinWorkspace.OpenTin("Tin資料集的名稱");
4.2 建立Tin資料集
ITin tin = new TinClass();
ITinEdit tinEdit = tin as ITinEdit;
// 用IEnvelope初始化,此步必須,否則抛異常
tinEdit.InitNew(IEnvelope變量);
// 如果需要加入資料或賦予空間參考,請使用以下注釋的代碼
// tinEdit.Add*(); // 此處代表7個添加資料源的方法
// tinEdit.Refresh();
tinEdit.SaveAs(@"包括Tin名稱的路徑,名稱全英文小寫為佳", true);
7個添加資料源的方法詳見參考文檔,此處截圖

- 第一個方法添加一個IFeatureClass以生成Tin,可以是點線面要素;
- 第二個方法添加一個IFeatureCursor,使用IFeatureClass.Search()傳回的查詢型指針即可。
- 第三個不知道,可以不管;
- 第四個添加有Z字段的IPoint,測試中發現此方法不穩定;
- 第五個添加IGeometry,需要指定Z字段;
- 第六個添加有Z字段的IGeometry;
- 第七個不知道,可以不管;
七種方法中,第一、第二種方法最穩定,但是參數比較複雜;第四、五、六種方法較為簡潔,可以用于局部重新整理時使用。
4.3 更新Tin
主要是使用ITinEdit.Refresh()和Save()方法。
// ITin轉ITinEdit
public void FreshTin(ITin tin){
ITinEdit tinEdit = tin as ITinEdit;
tinEdit.Refresh(); //Tin重新構網
tinEdit.Save(); //Tin在硬碟上的資料更新
}
4.4 Tin資料集有關資訊讀取
主要使用ITin接口與IGeoDataset接口。
ITin接口可以擷取Tin資料集的描述資訊,例如頂點數、三角形數、邊數等
4.5 Tin資料集進階操作
主要使用ITinAdvanced、ITinSurface接口。