最近在做一个分析功能时,需要循环调用Buffer来对图形创建缓冲区。在开发测试时没问题,但拿到客户实际使用时,出现异常。
后来把出异常的数据拿来测试,发现在调用Buffer时出错。但做为参数传入的图形确信是没有任何问题的。似乎是Buffer内部实现的问题。没辙,经过几天的尝试,总算找到了解决办法。
在Buffer调用出错后,稍微调整一下缓冲距离参数就成功了。于是,写了一个Buffer封装函数:
/// <summary> /// 用拓扑分析求出缓冲区范围。 /// 由于ArcGIS的问题,有时调用会出异常,因此需要循环调用 /// </summary> /// <param name="oShape">要缓冲区的图形</param> /// <param name="dbTolerance">缓冲距离</param> /// <returns>生成的缓冲区图形</returns>
public static IGeometry GetBuffer(IGeometry oShape, double dbTolerance) { IGeometry oBuffer = null; if (oShape == null) return oBuffer; ITopologicalOperator pTopo = oShape as ITopologicalOperator; if (!pTopo.IsSimple) {//如果不是简单图形,进行简化处理 pTopo.Simplify(); }
esriGeometryType iType = oShape.GeometryType;
//参数不正确 if (dbTolerance < 0 && iType != esriGeometryType.esriGeometryPolygon) return oBuffer;
int iTry = 0;//尝试10次 while (oBuffer == null && iTry <= 10) { try {
//如果调用不成功,将缓冲距离加0.01倍再试(如果第10次成功,则缓冲距离比原来大了0.09倍)
//如果对缓冲距离要求更严格,可以减少增量的倍数
//根据测试经验,一般最多尝试三次就可以成功 oBuffer = pTopo.Buffer(dbTolerance * (1.0 + 0.01 * iTry)); } catch { oBuffer = null; iTry = iTry + 1; } } return oBuffer; }