转:ITopologicalOperator 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;
  }

 

PS:代码并不重要,重要的是思路,变通才是王道,也许是当时本人觉得很有想法,所以把代码给留了下来。

posted @ 2013-10-22 14:02  一点味  阅读(360)  评论(0编辑  收藏  举报