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

cms建站系统免费免费ip地址代理软件

cms建站系统免费,免费ip地址代理软件,wordpress 4.8 中文包,做标签网站是什么ArcPy 与 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.zqtcl.cn/news/478952/

相关文章:

  • 945新开传奇网站深圳动画营销推广的原因
  • 网站制作加盟网站推广 知乎
  • 广西东晋建设有限公司网站电商详情页模板免费套用
  • dedecms 做影网站商丘家居网站建设
  • 七里港网站建设商城购物网站有哪些模块
  • 中英网站怎么做网站域名的作用是什么
  • 网站建设开题报告ppt模板重庆建设工程信息网址
  • 做个什么类型网站百度云资源链接分享群组
  • 商务网站建设的主流程西安建设局网站
  • 邢台营销型网站建设做网站的保证承诺
  • 关于茶叶的网站模板免费下载wordpress多边形按钮
  • 贵阳市网站建设手工制作花
  • 娄底哪里做网站免费永久不限空间
  • 网站标签怎么做wordpress 后台模板
  • 内江移动网站建设网站内部链接的作用有哪些
  • 阿里云的wordpress建站wordpress 批量定时发布
  • 网站院长信箱怎么做海报设计制作网站
  • 办网站如何备案怎么制作微信链接网页
  • 聊城门户网站建设怎样能有个人网站
  • 营销网站建设资料创意网站 模板
  • 免费的短网址生成器深圳外贸网站优化
  • 网站推广哪个平台最好图库
  • 在东莞做网站vue做网站好吗
  • 手机网站的页面大小郑州恩恩网站建设
  • 视频运营管理平台长沙网站seo技术
  • 网站建设有哪些规章制度网页版面
  • 海伦网站建设做网站建设的联系电话
  • 免费做字体的网站枣强网站建设代理
  • 建设网站素材海南百度推广公司电话
  • 温州企业网站建设费用培训行业门户网站建设方案