核心 API 流程
- 建立
ITinEdit,透過 InitNew 初始化 TIN。
- 使用
ITinEdit.AddFromFeatureClass 將點要素類導入為 TIN 節點。
- 呼叫
ITinAdvanced.ConvertToVoronoiRegions 生成泰森多邊形要素類。
完整可執行代碼
public IFeatureClass CreateVoronoi(IFeatureClass pointFC, IFeatureWorkspace ws, String outName) {
// 1. 建立 TIN
ITinEdit tinEdit = new TinClass();
ITin tin = tinEdit.InitNew(new TinNameClass() { Name = "TempTin" });
// 2. 導入點 (假設 Z 值欄位為 "Elevation")
ITinFeatureSourceFilter filter = new TinFeatureSourceFilterClass();
filter.FeatureClass = pointFC;
filter.HeightField = "Elevation"; // 或 "Shape.Z" 若為 3D 點
filter.TagValueField = "OBJECTID";
tinEdit.AddFromFeatureClass(filter);
// 3. 生成 Voronoi (泰森多邊形)
ITinAdvanced tinAdv = (ITinAdvanced)tin;
IFeatureClass voronoiFC = tinAdv.ConvertToVoronoiRegions(
null, // pFeatureClass: null 表示輸出新要素類
null, // pFilter: 無過濾
null, // pClippingPolygon: 無裁剪
"OBJECTID", // indexFieldName
"TAG" // tagFieldName
);
// 4. 重命名並儲存至目標工作區
IDataset ds = (IDataset)voronoiFC;
IFeatureClassName fcName = new FeatureClassNameClass();
fcName.FeatureDatasetName = new FeatureDatasetNameClass();
fcName.FeatureDatasetName.WorkspaceName = ((IDataset)ws).FullName;
fcName.Name = outName;
ds.Rename(fcName);
return voronoiFC;
}
關鍵參數說明
HeightField:TIN 節點高程來源,2D 點可用常數或忽略。
TagValueField:節點標識欄位,Voronoi 輸出會保留此屬性。
ConvertToVoronoiRegions 參數:
pFeatureClass:傳 null 自動建立新類;傳現有類則追加。
pClippingPolygon:外部邊界多邊形,限制 Voronoi 範圍 (如研究區邊界)。
indexFieldName:輸出要素關聯原始節點的索引欄位。
tagFieldName:輸出要素攜帶的標籤欄位。
常見坑點
- 點坐標參考系統必須一致 (投影坐標系),地理坐標系 (WGS84) 直接生成 Voronoi 面積計算會失真。
- 大量點 (>10萬) 生成 TIN 耗時較久,建議先篩選或分塊處理。
- 釋放 COM 物件:
Marshal.ReleaseComObject(tinEdit) 等,防止記憶體洩漏。