ArcEngine 平頭緩衝區

源起

數據處理過程中,發現圓頭的緩衝區會多出來一截,如果用線的緩衝區和另外一條線求交點,那麼求出的交點會跑到線的外側與實際不否,以下代碼是生成平頭緩衝區的代碼。

解決方案

實現平頭緩衝區主要使用IBufferConstruction接口實現,以下代碼是我的解決思路,供大家參考,如果好用記得給我點贊哈

public static IGeometry buffer(IGeometry pGeometry, double dis)
{
    ITopologicalOperator5 topolOperator = pGeometry as ITopologicalOperator5;
    topolOperator.Simplify();
    //這塊我是地理座標系,輸入的緩衝區距離是10米,需要轉換到度
    double distance = ConvertUnit(dis, esriUnits.esriMeters, esriUnits.esriDecimalDegrees);
    IGeometry bufferGeometry = FlatBuffer(pGeometry as IPolyline, distance);
    return bufferGeometry;
}

private static IGeometry FlatBuffer(IGeometry pGeometry, double dis)
{
    IPolyline5 polyline = pGeometry as IPolyline5;
    IGeometryBag geoBag = new GeometryBagClass();
    geoBag.SpatialReference = pGeometry.SpatialReference;
    IGeometryCollection geometryCollection = geoBag as IGeometryCollection;
    geometryCollection.AddGeometry(polyline);
    IEnumGeometry pInputGeometrys = geometryCollection as IEnumGeometry;
    IBufferConstruction pBufferConstruction = new BufferConstructionClass();
    IBufferConstructionProperties2 pBufferProps = pBufferConstruction as IBufferConstructionProperties2;
    pBufferProps.SideOption = esriBufferConstructionSideEnum.esriBufferFull;
    pBufferProps.EndOption = esriBufferConstructionEndEnum.esriBufferFlat;
    pBufferProps.UnionOverlappingBuffers = true;
    pBufferProps.GenerateCurves = false;
    IGeometryCollection outputBuffers = new GeometryBagClass();
    pBufferConstruction.ConstructBuffers(pInputGeometrys, dis, outputBuffers);

    IPolygon pResultPolygon = new PolygonClass();
    ITopologicalOperator2 pTopoOp = pResultPolygon as ITopologicalOperator2;
    IEnumGeometry pOutputGeometrys = outputBuffers as IEnumGeometry;
    pTopoOp.ConstructUnion(pOutputGeometrys);

    System.Runtime.InteropServices.Marshal.ReleaseComObject(pInputGeometrys);
    System.Runtime.InteropServices.Marshal.ReleaseComObject(pOutputGeometrys);
    return pResultPolygon;
}

附一張效果圖:
在這裏插入圖片描述

可能會遇到的問題

直接引用參考資料1中的代碼,大數據量下可能會遇到如下問題an error occurred during the buffer operation,這塊我個人認爲產生此問題的原因可能是代碼的寫法不對以及內存沒有及時的釋放造成的,建議參考我上面代碼的寫法。


參考資料:

  1. Engine中實現平頭緩衝
  2. GitHub用到緩衝區的參考代碼
  3. 實現平頭緩衝
  4. GIS 中生成平頭緩衝區的方法(此方法會產生孔洞,不建議使用)
  5. ArcEngine 緩衝區
  6. Arcobjects ConstructBuffers produces Error -2147220889?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章