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