ITopologicalOperator Buffer调用异常的解决方法 .异常来自 HRESULT:0x8004023E
最近在做一个分析功能时,需要循环调用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;
}
来自:http://blog.csdn.net/denny553/article/details/4331664#comments
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理