首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

ArcGIS Engine C# 點生成 TIN 舰泰森多邊形 (Voronoi) 完整代碼方案

     編輯:程式設計綜合問答

核心 API 流程

  1. 建立 ITinEdit,透過 InitNew 初始化 TIN。
  2. 使用 ITinEdit.AddFromFeatureClass 將點要素類導入為 TIN 節點。
  3. 呼叫 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:輸出要素攜帶的標籤欄位。

常見坑點

  1. 點坐標參考系統必須一致 (投影坐標系),地理坐標系 (WGS84) 直接生成 Voronoi 面積計算會失真。
  2. 大量點 (>10萬) 生成 TIN 耗時較久,建議先篩選或分塊處理。
  3. 釋放 COM 物件:Marshal.ReleaseComObject(tinEdit) 等,防止記憶體洩漏。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved