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

SuperMap iObjects .NET 11i 二次开发(十六)—— 叠加分析之合并

前言

上一篇博文简单介绍了有关类型转换之面转点的相关操作,这个部分主要认识下叠加分析之合并的相关操作。


一、有关常用类说明

OverlayAnalyst类

叠加分析类。该类用于对输入的两个数据集或记录集之间进行各种叠加分析运算。

二、有关常用方法说明

OverlayAnalyst.Union(DatasetVector[],OverlayOutputAttributeType,Double,Datasource,String)

用于对多个面数据集进行合并方式的叠加分析,结果数据集中保存被合并叠加分析的数据集。

三、界面设计

在原有界面基础上,添加合并相关功能点,如下图所示:

四、功能实现

private void 合并ToolStripMenuItem_Click(object sender, EventArgs e)
{try{// 1. 获取当前选中的多个数据集节点List<WorkspaceTreeNodeBase> selectedNodes = new List<WorkspaceTreeNodeBase>();// 获取工作空间树中所有选中的节点foreach (TreeNode node in D_workspaceControl.WorkspaceTree.SelectedNodes){if (node is WorkspaceTreeNodeBase workspaceNode){selectedNodes.Add(workspaceNode);}}// 2. 检查是否选择了至少2个数据集if (selectedNodes.Count < 2){MessageBox.Show("请至少选择2个面数据集进行合并操作!\n\n操作说明:按住Ctrl键多选数据集节点,然后点击合并功能。");return;}// 3. 将选中的节点转换为数据集列表List<DatasetVector> selectedDatasets = new List<DatasetVector>();List<string> invalidDatasets = new List<string>();foreach (WorkspaceTreeNodeBase node in selectedNodes){Dataset dataset = D_workspace.Datasources[0].Datasets[node.Text];if (dataset == null){invalidDatasets.Add(node.Text);continue;}// 检查是否为矢量数据集if (!(dataset is DatasetVector)){invalidDatasets.Add($"{node.Text} (非矢量数据集)");continue;}DatasetVector vectorDataset = (DatasetVector)dataset;// 检查是否为面数据集(Union方法要求)if (vectorDataset.Type != DatasetType.Region){invalidDatasets.Add($"{node.Text} ({GetDatasetTypeChineseName(vectorDataset.Type)}数据集)");continue;}selectedDatasets.Add(vectorDataset);}// 4. 检查有效的面数据集数量if (selectedDatasets.Count < 2){string invalidList = invalidDatasets.Count > 0 ?$"\n\n无效的数据集:\n{string.Join("\n", invalidDatasets)}" : "";MessageBox.Show($"需要至少选择2个面数据集进行合并!当前选择了 {selectedDatasets.Count} 个有效的面数据集。{invalidList}");return;}// 5. 显示无效数据集的警告(如果有)if (invalidDatasets.Count > 0){MessageBox.Show($"以下选中的数据集不是面数据集,将被排除在合并操作之外:\n{string.Join("\n", invalidDatasets)}","警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);}// 6. 检查所有数据集的投影信息一致性PrjCoordSys firstPrj = selectedDatasets[0].PrjCoordSys;List<string> inconsistentDatasets = new List<string>();for (int i = 1; i < selectedDatasets.Count; i++) // 从第二个开始检查{if (!IsPrjCoordSysEqual(firstPrj, selectedDatasets[i].PrjCoordSys)){inconsistentDatasets.Add(selectedDatasets[i].Name);}}if (inconsistentDatasets.Count > 0){MessageBox.Show($"数据集投影信息不一致!请确保所有数据集使用相同的投影坐标系。\n" +$"投影不一致的数据集: {string.Join(", ", inconsistentDatasets)}\n" +$"参考投影: {selectedDatasets[0].Name}");return;}// 7. 检查数据集是否都有记录List<string> emptyDatasets = new List<string>();foreach (DatasetVector dataset in selectedDatasets){if (dataset.RecordCount == 0){emptyDatasets.Add(dataset.Name);}}if (emptyDatasets.Count > 0){MessageBox.Show($"以下数据集没有记录,无法进行合并:\n{string.Join("\n", emptyDatasets)}");return;}// 8. 设置合并参数DatasetVector[] inputDatasets = selectedDatasets.ToArray();OverlayOutputAttributeType outputAttributeType = OverlayOutputAttributeType.OnlyAttributes;double tolerance = 0.0; // 容限值,根据实际情况调整// 生成唯一的结果数据集名称string resultDatasetName = GenerateUniqueDatasetName("面数据集合并结果");Datasource resultDatasource = selectedDatasets[0].Datasource;// 9. 显示确认对话框StringBuilder confirmMessage = new StringBuilder();confirmMessage.AppendLine($"将要合并以下 {selectedDatasets.Count} 个面数据集:");foreach (DatasetVector dataset in selectedDatasets){confirmMessage.AppendLine($"  • {dataset.Name} ({dataset.RecordCount} 条记录)");}confirmMessage.AppendLine();confirmMessage.AppendLine($"结果数据集: {resultDatasetName}");confirmMessage.AppendLine();confirmMessage.AppendLine("是否继续执行合并操作?");DialogResult confirmResult = MessageBox.Show(confirmMessage.ToString(),"确认面数据集合并",MessageBoxButtons.YesNo,MessageBoxIcon.Question);if (confirmResult != DialogResult.Yes){return;}// 10. 执行合并操作DatasetVector unionResult = OverlayAnalyst.Union(inputDatasets,outputAttributeType,tolerance,resultDatasource,resultDatasetName);if (unionResult != null){MessageBox.Show($"面数据集合并完成!\n" +$"成功合并了 {selectedDatasets.Count} 个面数据集\n" +$"结果数据集:{resultDatasetName}\n" +$"总记录数:{unionResult.RecordCount}","合并成功",MessageBoxButtons.OK,MessageBoxIcon.Information);// 刷新工作空间树显示新数据集D_workspaceControl.WorkspaceTree.Refresh();}else{MessageBox.Show("面数据集合并失败!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);}}catch (Exception ex){MessageBox.Show($"面数据集合并过程中发生错误: {ex.Message}\n\n堆栈跟踪:\n{ex.StackTrace}","错误",MessageBoxButtons.OK,MessageBoxIcon.Error);}
}// 辅助方法
private bool IsPrjCoordSysEqual(PrjCoordSys prj1, PrjCoordSys prj2)
{if (prj1 == null && prj2 == null) return true;if (prj1 == null || prj2 == null) return false;return prj1.ToString() == prj2.ToString();
}private string GenerateUniqueDatasetName(string baseName)
{string resultName = baseName;int counter = 1;while (D_workspace.Datasources[0].Datasets[resultName] != null){resultName = $"{baseName}_{counter}";counter++;}return resultName;
}private string GetDatasetTypeChineseName(DatasetType datasetType)
{switch (datasetType){case DatasetType.Point: return "点";case DatasetType.Line: return "线";case DatasetType.Region: return "面";default: return datasetType.ToString();}
}

五、运行结果


总结

以上就是有关于 SuperMap iObjects 11i .NET 类型转换之线面互转相关操作的一些过程记录,我们下篇博文再见!

http://www.dtcms.com/a/535754.html

相关文章:

  • 【Linux笔记】网络部分——传输层协议UDP
  • Ansible 自动化项目结构与 Harbor 安装示例(基于 kubeasz)①
  • Spring 源码学习(十五)—— HandlerMethodReturnValueHandler
  • everviz 数据可视化平台
  • 12 U盘挂载
  • 【Kylin Linux root 密码故障处置指南(超限重试 + 改回原密码)】
  • 网络原理:数据链路层、NAT与网页加载
  • 【从零开始开发远程桌面连接控制工具】01-项目概述与架构设计
  • 网站建设竞价托管什么意思在国内做推广产品用什么网站好
  • 有没有做宠物的网站网站开发中间商怎么做
  • 深度强化学习 | 详解从信赖域策略优化(TRPO)到近端策略优化(PPO)算法原理
  • 在类中定义装饰器:Python高级元编程技术详解
  • [C++][正则表达式]常用C++正则表达式用法
  • 基于大数据的短视频数据分析系统 Spark哔哩哔哩视频数据分析可视化系统 Hadoop大数据技术 情感分析 舆情分析 爬虫 推荐系统 协同过滤推荐算法 ✅
  • 参考抖音推荐算法的功能:不同用户规模的推荐技术框架
  • 深入理解C语言scanf函数:从基础到高级用法完全指南
  • 检测相邻递增子数组1 2(LeetCode 3349 3350)
  • 《算法闯关指南:优选算法--前缀和》--25.【模板】前缀和,26.【模板】二维前缀和
  • 快速搭建网站2020缅甸新闻最新消息
  • 搜索网站做推广全网推广平台推荐
  • 仓颉编程(16)泛型类型
  • 「小有可为」AI 开源公益创新挑战赛
  • 《 Linux 点滴漫谈: 四 》文件权限与用户管理
  • 评估虚拟机资源规划
  • 深入理解 SO_REUSEADDR:从“Address already in use”到服务器瞬间重启
  • 机器人中的多模态——RoboBrain
  • MySQL 8.0.x 全平台安装指南:Windows、CentOS、Ubuntu 详细步骤与问题解决
  • YOLO!!
  • 电子电气架构 --- 汽车座舱行业背景综述
  • C++(23):通过print和printIn进行输出