尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

SuperMap iObjects .NET 11i 二次开发(十五)—— 类型转换之面转点 - 教程

SuperMap iObjects .NET 11i 二次开发(十五)—— 类型转换之面转点 - 教程
📅 发布时间:2026/6/19 13:46:23

前言

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


一、有关常用类说明

可跳转以下博文进行查看:

SuperMap iObjects .NET 11i 二次开发(十三)—— 类型转换之点线互转https://blog.csdn.net/Adoudoudou_/article/details/151954603?spm=1001.2014.3001.5502

SuperMap iObjects .NET 11i 二次开发(十四)—— 类型转换之线面互转https://blog.csdn.net/Adoudoudou_/article/details/151964135?spm=1001.2014.3001.5502

二、有关常用属性说明

GeoRegion.InnerPoint

获取几何对象的内点。

三、界面设计

桌面端在进行类型转换中的面转点时,结果为面对象的内点,如果需要转换结果为面的节点,那么需要先将面转为线再将线转为点。在原有界面基础上,添加类型转换相关功能点,如下图所示:

四、功能实现

1、面转点

private void 面转点ToolStripMenuItem_Click(object sender, EventArgs e)
{try{WorkspaceTreeNodeBase treeNode = D_workspaceControl.WorkspaceTree.SelectedNode as WorkspaceTreeNodeBase;if (treeNode == null){MessageBox.Show("请先选择一个数据集节点");return;}string polygonname = treeNode.Text;// 1. 获取选中的数据集并检查是否为面数据集Dataset selectedDataset = D_workspace.Datasources[0].Datasets[polygonname];// 类型检查if (selectedDataset.Type != DatasetType.Region){MessageBox.Show($"请选择面数据集进行操作!\n当前选择的数据集 '{polygonname}' 的类型为: {selectedDataset.Type}");return;}// 验证是否为矢量数据集if (!(selectedDataset is DatasetVector)){MessageBox.Show("选中的数据集不是矢量数据集");return;}DatasetVector polygonDataset = (DatasetVector)selectedDataset;// 检查数据集是否为空if (polygonDataset.RecordCount == 0){MessageBox.Show("面数据集中没有记录,无法进行转换");return;}// 设置点数据集的结构信息DatasetVectorInfo pointDatasetInfo = new DatasetVectorInfo();pointDatasetInfo.Name = polygonDataset.Name + "_Points";pointDatasetInfo.Type = DatasetType.Point;// 创建点数据集DatasetVector pointDataset = this.D_workspace.Datasources[0].Datasets.Create(pointDatasetInfo);if (pointDataset == null){MessageBox.Show("点数据集创建失败");return;}// 2. 遍历面数据集中的每条记录并转换为点using (Recordset polygonRecordset = polygonDataset.GetRecordset(false, CursorType.Dynamic))using (Recordset pointRecordset = pointDataset.GetRecordset(false, CursorType.Dynamic)){int totalPoints = 0;polygonRecordset.MoveFirst();while (!polygonRecordset.IsEOF){// 获取面几何对象GeoRegion geoRegion = polygonRecordset.GetGeometry() as GeoRegion;if (geoRegion != null){// 将面转换为线GeoLine geoLine = geoRegion.ConvertToLine();if (geoLine != null){// 处理线的每个部分(支持多部分线)for (int partIndex = 0; partIndex < geoLine.PartCount; partIndex++){Point2Ds points = geoLine[partIndex];// 为每个顶点创建点对象foreach (Point2D point2D in points){// 创建点几何对象GeoPoint point = new GeoPoint(point2D);// 添加新记录pointRecordset.AddNew(point);pointRecordset.Update();totalPoints++;}}}}polygonRecordset.MoveNext();}MessageBox.Show($"转换完成!共生成 {totalPoints} 个点要素到点数据集 '{pointDataset.Name}'");}}catch (Exception ex){MessageBox.Show($"面转点过程中发生错误: {ex.Message}");}
}

2、面转内点(同桌面端)

private void 面转内点ToolStripMenuItem_Click(object sender, EventArgs e)
{try{WorkspaceTreeNodeBase treeNode = D_workspaceControl.WorkspaceTree.SelectedNode as WorkspaceTreeNodeBase;if (treeNode == null){MessageBox.Show("请先选择一个数据集节点");return;}string polygonname = treeNode.Text;// 1. 获取选中的数据集并检查是否为面数据集Dataset selectedDataset = D_workspace.Datasources[0].Datasets[polygonname];// 类型检查if (selectedDataset.Type != DatasetType.Region){MessageBox.Show($"请选择面数据集进行操作!\n当前选择的数据集 '{polygonname}' 的类型为: {selectedDataset.Type}");return;}if (!(selectedDataset is DatasetVector)){MessageBox.Show("选中的数据集不是矢量数据集");return;}DatasetVector polygonDataset = (DatasetVector)selectedDataset;// 检查数据集是否为空if (polygonDataset.RecordCount == 0){MessageBox.Show("面数据集中没有记录,无法进行转换");return;}// 设置点数据集的结构信息DatasetVectorInfo pointDatasetInfo = new DatasetVectorInfo();pointDatasetInfo.Name = polygonDataset.Name + "_InnerPoints";pointDatasetInfo.Type = DatasetType.Point;// 创建点数据集DatasetVector pointDataset = this.D_workspace.Datasources[0].Datasets.Create(pointDatasetInfo);if (pointDataset == null){MessageBox.Show("点数据集创建失败");return;}// 2. 遍历面数据集中的每条记录并获取内点using (Recordset polygonRecordset = polygonDataset.GetRecordset(false, CursorType.Dynamic))using (Recordset pointRecordset = pointDataset.GetRecordset(false, CursorType.Dynamic)){int processedCount = 0;int totalCount = polygonDataset.RecordCount;polygonRecordset.MoveFirst();while (!polygonRecordset.IsEOF){// 获取面几何对象GeoRegion geoRegion = polygonRecordset.GetGeometry() as GeoRegion;if (geoRegion != null){// 获取面的内点(质心点)Point2D innerPoint2D = geoRegion.InnerPoint;if (innerPoint2D != null){// 将Point2D转换为GeoPointGeoPoint geoPoint = new GeoPoint(innerPoint2D);// 添加新的点记录pointRecordset.AddNew(geoPoint);pointRecordset.Update();processedCount++;}}polygonRecordset.MoveNext();}MessageBox.Show($"转换完成!共生成 {processedCount} 个内点到点数据集 '{pointDataset.Name}'");}}catch (Exception ex){MessageBox.Show($"面转内点过程中发生错误: {ex.Message}");}
}

五、运行结果


总结

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

相关新闻

  • AT_agc035_c [AGC035C] Skolem XOR Tree
  • 炼石#8 T1
  • AI+手搓第一个AI Agent“AI胜铭兰”

最新新闻

  • 端午充电季|乘风破浪,技能进阶正当时
  • 武汉想养猫狗先看看,梦宠山庄探店记录 - 园友3800037
  • FanControl V270终极指南:Windows系统智能风扇控制的完整解决方案
  • 海口黄金回收避坑指南!2026本地行情解析,这样卖金更划算✨ - 奢品小当家
  • MC68060软件包深度解析:浮点库实现与操作系统集成实战
  • C语言数学函数库深度解析:fabs、fmod、hypot的原理、陷阱与工程实践

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号