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

浙公网安备 33010602011771号