Loading

ITopologicalOperator.Buffer调用异常的解决方法

ITopologicalOperator.Buffer 调用异常问题解决

	/// <summary>
	/// buffer失败时,在特定的缓冲距离可能出现异常
	/// 对缓冲距离要求特别严格时,不建议使用该方法
	/// </summary>
	/// <param name="oShape"></param>
	/// <param name="dbTolerance"></param>
	/// <param name="maxTry"></param>
	/// <param name="stepIncreace">每次失败,增加 dbTolerance * stepIncreace 的距离后进行重试</param>
	/// <returns></returns>
	public IGeometry GetBuffer(IGeometry oShape, double dbTolerance, int maxTry = 10, double stepIncreace = 0.00001)
	{
		IGeometry oBuffer = null;
		if (oShape == null)
			return oBuffer;
		ITopologicalOperator pTopo = oShape as ITopologicalOperator;
		try
		{
			return pTopo.Buffer(dbTolerance);
		}
		catch (Exception ex)
		{
			_logger.Warn("生成缓冲区失败:" + ex.Message + "  尝试重新生成...");
		}

		if (!pTopo.IsSimple)
		{//如果不是简单图形,进行简化处理
			_logger.Warn("存在拓扑错误,尝试进行修复...");
			pTopo.Simplify();
		}

		esriGeometryType iType = oShape.GeometryType;
		////参数不正确
		//if (dbTolerance < 0 && iType != esriGeometryType.esriGeometryPolygon)
		//    return oBuffer;
		int iTry = 1;//尝试次数
		while (oBuffer == null && iTry <= maxTry)
		{
			try
			{
				_logger.Warn($"生成缓冲区[距离={dbTolerance * (1.0 + stepIncreace * (iTry - 1))}]失败,修改为[距离={dbTolerance * (1.0 + stepIncreace * iTry)}]后尝试重新生成...");
				oBuffer = pTopo.Buffer(dbTolerance * (1.0 + stepIncreace * iTry));
			}
			catch
			{
				oBuffer = null;
				iTry = iTry + 1;
			}
		}
		_logger.Warn($"生成缓冲区[距离={dbTolerance * (1.0 + stepIncreace * iTry)}]成功");
		return oBuffer;
	}

参考

ITopologicalOperator Buffer调用异常的解决方法 .异常来自 HRESULT:0x8004023E

posted @ 2025-03-12 22:38  一起滚月球  阅读(28)  评论(0)    收藏  举报