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;
    
    //如果构建缓冲区出错,可以修改如下两句为false、true再试试
    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. 直接引用参考资料1中的代码,大数据量下可能会遇到如下问题an error occurred during the buffer operation,这块我个人认为产生此问题的原因可能是代码的写法不对以及内存没有及时的释放造成的,建议参考我上面代码的写法。

  2. The coordinates or measures are out of bounds,针对这块的解决方案:

    1. 对FeatureClass重新计算空间范围
    2. 修改缓冲区的相关参数,如下
        pBufferProps.UnionOverlappingBuffers = false;
    	pBufferProps.GenerateCurves = true;
    

参考资料:
4. Engine中实现平头缓冲
5. GitHub用到缓冲区的参考代码
6. 实现平头缓冲
7. GIS 中生成平头缓冲区的方法(此方法会产生孔洞,不建议使用)
8. ArcEngine 缓冲区
9. Arcobjects ConstructBuffers produces Error -2147220889?

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ArcEngine是Esri公司基于ArcGIS平台开发的一套GIS开发工具包。其中的缓冲区分析是指在地理空间数据中根据一定的距离或者区域范围,在目标要素周围生成一个特定的缓冲区,用于分析和描述目标要素周围的空间关系和属性。 缓冲区分析在许多GIS应用中都是一个非常重要的功能,它可以通过计算和定义缓冲区范围,帮助用户理解和分析地理空间数据。在ArcEngine中,通过使用BufferGeoprocessor类可以实现缓冲区分析。 在进行缓冲区分析之前,首先需要将目标要素加载到ArcEngine中,并确定所需的缓冲区距离或者区域范围。然后通过BufferGeoprocessor类的方法,设置缓冲区的参数和属性,如距离单位、缓冲区类型等。 通过调用BufferGeoprocessor类的execute方法,可以开始进行缓冲区分析操作。在执行过程中,ArcEngine会根据所设置的参数将缓冲区应用到目标要素周围,并生成新的几何要素,形成缓冲区图形。用户可以根据需要保存缓冲区的结果或者将结果用于后续的空间分析和地图展示等操作。 缓冲区分析可以广泛应用于不同的领域,比如环境规划、交通规划、土地利用规划等。通过ArcEngine提供的缓冲区分析功能,用户可以更加直观地分析和描述地理空间数据,帮助做出科学决策。同时,ArcEngine还提供了许多其他的地理空间分析工具和功能,可以进一步扩展和应用缓冲区分析的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值