当前位置: 首页 > news >正文

设计建设网站哈尔滨开网站

设计建设网站,哈尔滨开网站,杂志网站建设,wordpress $limitArcPy 与 ArcGIS .NET SDK 读取 GDB 要素类坐标系失败#xff1f;GDAL 外挂方案详解 在ArcGIS Pro中正常显示的坐标系#xff0c;为何通过ArcPy或.NET SDK却无法正确读取#xff1f;本文将分享我在处理CGCS2000坐标系时的踩坑经历#xff0c;以及最终通过GDAL外挂方案解决问…ArcPy 与 ArcGIS .NET SDK 读取 GDB 要素类坐标系失败GDAL 外挂方案详解 在ArcGIS Pro中正常显示的坐标系为何通过ArcPy或.NET SDK却无法正确读取本文将分享我在处理CGCS2000坐标系时的踩坑经历以及最终通过GDAL外挂方案解决问题的全过程。 1 问题背景神秘的坐标系丢失 在开发ArcGIS Pro插件时遇到一个棘手问题在ArcGIS Pro界面中可以正常查看GDB要素类的坐标系CGCS2000 3度分带投影 黄海高程坐标系但使用ArcPy或.NET SDK读取时却无法获取正确的坐标系信息。返回的结果令人困惑 WKT: {B286C06B-0879-11D2-AACA-00C04FA33C20} JSON: {wkid:null,xyTolerance:0.001,zTolerance:0.001,mTolerance:0.001, falseX:-450359962737.049011,falseY:-450359962737.049011,xyUnits:10000, falseZ:-100000,zUnits:10000,falseM:-100000,mUnits:10000}这个神秘的GUID {B286C06B-0879-11D2-AACA-00C04FA33C20} 实际上是Esri内部使用的Unknown坐标系标识符表示坐标系信息无法被识别。 2 为什么GDAL可以正常读取 GDALGeospatial Data Abstraction Library作为开源地理数据处理库对坐标系的处理更加灵活 支持自定义坐标系定义 能识别复合坐标系平面高程 更宽松的坐标系解析机制 直接访问底层数据格式 而Esri的API在处理某些复合坐标系时存在限制特别是当坐标系未在Esri的坐标系库中注册时。 3 解决方案外挂GDAL进程架构 由于在ArcGIS Pro插件中直接集成GDAL存在兼容性问题采用了外挂进程方案 3.1 核心实现代码优化 3.1.1 独立GDAL工具程序 // 增强参数校验和错误处理 public class GetGdbFeatureClassSpatialReferenceTool : ITool {public async TaskToolExecutionResult\ Execute(string\[\]? args \ null){try{if (args \ null || args.Length 2)return ToolExecutionResult.ToFailure(参数错误需要GDB路径和图层名称);string gdbPath \ args\[0\];string lyrName \ args\[1\];if (!Directory.Exists(gdbPath))return ToolExecutionResult.ToFailure($GDB路径不存在: {gdbPath});// 初始化GDALGdalConfiguration.ConfigureGdal();Gdal.SetConfigOption(SHAPE\_ENCODING, UTF-8);using var driver \ Ogr.GetDriverByName(OpenFileGDB);using var dataSource \ driver?.Open(gdbPath, 0);if (dataSource \ null)return ToolExecutionResult.ToFailure(无法打开GDB文件);// 优化图层查找逻辑Layer layer \ FindLayerByName(dataSource, lyrName);if (layer \ null)return ToolExecutionResult.ToFailure($找不到图层: {lyrName});var sr \ layer.GetSpatialRef();if (sr \ null)return ToolExecutionResult.ToFailure(图层未定义空间参考);if (sr.ExportToWkt(out string wkt) ! 0)return ToolExecutionResult.ToFailure(坐标系转换失败);return ToolExecutionResult.ToSuccess(wkt);}catch (Exception ex){return ToolExecutionResult.ToFailure(ex);}}private Layer FindLayerByName(DataSource dataSource, string name){for (int i \ 0; i dataSource.GetLayerCount(); i){using var layer \ dataSource.GetLayerByIndex(i);if (layer.GetName().Equals(name, StringComparison.OrdinalIgnoreCase))return layer;}return null;} }3.1.2 增强型进程调用封装 // 主程序调用封装 public SpatialReference GetGdbFeatureClassSpatialReference(string gdbPath, string featureClassName) {try{using var process \ CreateGdalProcess(GetGdbFeatureClassSpatialReferenceTool, gdbPath, featureClassName);process.Start();// 异步读取输出避免死锁string output \ process.StandardOutput.ReadToEnd();string error \ process.StandardError.ReadToEnd();process.WaitForExit(5000); // 5秒超时if (process.ExitCode ! 0)throw new Exception($GDAL工具执行失败: {error});var result \ JsonSerializer.DeserializeToolExecutionResult\(output);if (!result.Success)throw new Exception($坐标系获取失败: {result.Message});return SpatialReferenceBuilder.CreateSpatialReference(result.Data);}catch (Exception ex){Logger.Error($坐标系获取异常: {ex.Message});return null;} }private Process CreateGdalProcess(string toolName, params string\[\] parameters) {var exePath \ Path.Combine(AppDomain.CurrentDomain.BaseDirectory, GdalTools, Geo.GdalTools.exe);if (!File.Exists(exePath))throw new FileNotFoundException(GDAL工具未找到, exePath);// 安全处理参数中的特殊字符var argsBuilder \ new StringBuilder(toolName);foreach (var param in parameters){argsBuilder.Append( \\);argsBuilder.Append(param.Replace(\\, \\\\));argsBuilder.Append(\\);}return new Process{StartInfo \ {FileName \ exePath,Arguments \ argsBuilder.ToString(),UseShellExecute \ false,RedirectStandardOutput \ true,RedirectStandardError \ true,CreateNoWindow \ true, // 不显示控制台窗口StandardOutputEncoding \ Encoding.UTF8,StandardErrorEncoding \ Encoding.UTF8}}; }3.1.3 3. 增强工具结果处理 public class ToolExecutionResult {public bool Success { get; set; }public string Message { get; set; }public string Data { get; set; }public string ErrorDetails { get; set; } // 新增错误详情public static ToolExecutionResult SuccessResult(string data, string message \ 成功) \ new ToolExecutionResult { Success \ true, Message \ message, Data \ data };public static ToolExecutionResult FailureResult(string message, string details \ null) \ new ToolExecutionResult { Success \ false, Message \ message, ErrorDetails \ details };public static ToolExecutionResult FromException(Exception ex){return new ToolExecutionResult{Success \ false,Message \ ex.Message,ErrorDetails \ ex.StackTrace};} }4 关键优化点 健壮的错误处理 增加参数有效性检查 异常捕获和详细日志 进程执行超时控制 安全的参数传递 正确处理路径中的空格和特殊字符 参数转义防止注入攻击 性能优化 异步读取进程输出 资源及时释放 超时控制 用户体验 隐藏控制台窗口 详细的错误信息 日志记录 代码可维护性 分离关注点 模块化设计 清晰的错误消息 5 部署注意事项 GDAL依赖管理 Geo.GdalTools.exe ├── gdal.dll ├── gdalplugins/ # GDAL插件目录 ├── proj.db # PROJ坐标数据库 └── geos.dll # GEOS几何库路径配置 使用相对路径确保可移植性 在插件初始化时验证GDAL工具是否存在 版本兼容性 固定GDAL版本建议3.4 与ArcGIS Pro版本同步测试 6 替代方案评估 方案优点缺点GDAL外挂进程稳定可靠兼容性好进程间通信开销直接集成GDAL性能好无需进程间通信与ArcGIS Pro冲突风险高Esri技术支持原生支持解决周期长可能无法解决特定坐标系问题坐标系转换避免读取问题需要事先知道坐标系信息 7 总结 通过GDAL外挂进程方案我们成功解决了Esri API无法读取特定坐标系的问题。关键点包括 问题隔离将GDAL操作放在独立进程中避免与ArcGIS Pro冲突 安全通信通过JSON格式进行进程间通信 健壮设计完善的错误处理和日志记录 用户透明在插件中无缝集成用户无感知 这种架构不仅解决了当前问题还为将来集成更多GDAL功能提供了扩展点。在实际项目中该方案已稳定处理数千个GDB文件证明了其可靠性和实用性。 地理信息处理中当标准工具无法满足需求时结合开源工具的创新方案往往能开辟新的解决路径。
http://www.pierceye.com/news/904410/

相关文章:

  • seo如何推广网站深圳网站的做网站公司
  • 架设网站是自己架设服务器还是租服务器佛山网站排名推广
  • 西安做网站哪家最便宜win系统的wordpress
  • 饲料网站源码3号台风最新消息
  • 天津 公司网站建设优化网站内容的方法
  • 网站 例能加速浏览器的加速器
  • 黄埔营销型网站建设山东诚铭建设机械有限公司网站
  • 东莞网站建设dgjcwlwordpress添加活动
  • 广州互邦物流网络优化建站关于网站开发的请示
  • 贵阳手机银行app论坛seo招聘
  • 太原建设北路小学网站铜仁市网站建设
  • 网站换服务器怎么做哪个公司做公司网站好
  • 东莞营销网站建设报价阿里云服务器部署网站
  • 品牌企业建站如何建设网站兴田德润简介呢
  • 思行做网站北京西站到大兴机场
  • 长沙网页制作模板的网站c++编程软件
  • 网站备案 人工审核安卓软件下载安装
  • 网站建设公司 专题制作怎么注册订阅号
  • 网站运营内容包含哪些深圳标本制作
  • wordpress 微信导航站南昌有哪些企业网站
  • 网站开发需要的人员南京手机网站
  • 上海网站建设知识 博客网站建设数据库的购买
  • 足彩网站开发网站建设 网站制作
  • 网站开发 定制 多少 钱小程序加盟代理前景
  • 河南网站建设官网wordpress博客主题哪个好
  • 网站建设会计帐务处理青岛发现51例阳性
  • 保定三金网络科技有限公司windows优化大师是哪个公司的
  • 华丰建设股份有限公司网站深圳影视广告在哪里好
  • 企业建设网站需要服务器吗谷德设计网官网首页入口
  • 新手学做网站步骤天津制作网站的公司电话