SuperMap iObjects .NET之二维线转三维线

本文详细介绍了如何在SuperMapiObjects.NET中利用二维线数据实现三维线转换,步骤包括创建三维线数据集、获取记录集、构造三维点并组装三维线对象。通过实例展示了将二维线数据提升到三维空间的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在超图的桌面产品中,包含了多种功能,其中也包括数据的基本处理功能。但是在各位伙伴在SuperMap iObjects .NET的使用过程中,也有二维转三维的需求,以下笔者就以二维线转三维线为例,详解这个过程。

实现原理:

1、创建三维线数据集(DatasetVector)

2、获取二维线和三维线记录集(Recordset)

3、使用二维线数据集记录集获取对象的节点,在使用对应的高度与二维节点一起组成三维点组

4、使用三维点构造三维线对象,将对象存入新建的三维线数据集中

具体实现方式:

创建三维线数据集(DatasetVector)

           DatasetVectorInfo vectorInfo = new DatasetVectorInfo();
            string name = dataset.Name.ToString() + "3d";
            vectorInfo.Name = name;
            vectorInfo.Type = DatasetType.Line3D;
            vectorInfo.IsFileCache = false;
           DatasetVector dataset3d = datasets.Create(vectorInfo);

获取二维线和三维线记录集

//三维线数据集记录集            
Recordset recordsetResult = dataset3d.GetRecordset(false, CursorType.Dynamic);
//二维线数据集记录集
Recordset recordset = dataset.GetRecordset(false,CursorType.Static);
recordset.MoveFirst();//将二维线记录集的位置从当前记录位置移动到第一条记录,使第一条记录成为当前记录

使用二维线数据集记录集获取对象的节点,在使用对应的高度与二维节点一起组成三维点组

  Point2Ds point2Ds = new Point2Ds();
  GeoLine geoLine = new GeoLine();

  GeoLine3D geoLine3d = new GeoLine3D();
  geoLine = recordset.GetGeometry() as GeoLine;
  point2Ds = geoLine[0];

  Point3Ds point3Ds = new Point3Ds();
  for(int j = 0; j < point2Ds.Count; j++)
      {
         Point3D point3D = new Point3D(point2Ds[j].X, point2Ds[j].Y, 50);//50指高度值
          point3Ds.Add(point3D);
       }
   geoLine3d.AddPart(point3Ds);

使用三维点构造三维线对象,将对象存入新建的三维线数据集中

 recordsetResult.AddNew(geoLine3d);
  recordset.MoveNext();
  recordsetResult.MoveLast();

总代码如下:

 WorkspaceTreeNodeBase nodeBase = WorkspaceControl.WorkspaceTree.SelectedNode as WorkspaceTreeNodeBase;
            DatasetVector dataset = nodeBase.GetData() as DatasetVector;//二维线数据集
            Datasource datasource = dataset.Datasource;
            Datasets datasets = datasource.Datasets;
            DatasetVectorInfo vectorInfo = new DatasetVectorInfo();
            string name = dataset.Name.ToString() + "3d";
            vectorInfo.Name = name;
            vectorInfo.Type = DatasetType.Line3D;
            vectorInfo.IsFileCache = false;
           DatasetVector dataset3d = datasets.Create(vectorInfo);//三维线数据集
            Recordset recordsetResult = dataset3d.GetRecordset(false, CursorType.Dynamic);
            //获取记录
            Recordset recordset = dataset.GetRecordset(false,CursorType.Static);
            recordset.MoveFirst();
            for (int i = 0; i < recordset.RecordCount; i++)
            {
                Point2Ds point2Ds = new Point2Ds();
                GeoLine geoLine = new GeoLine();

                GeoLine3D geoLine3d = new GeoLine3D();
                //Geometry geometry = recordset.GetGeometry();
                geoLine = recordset.GetGeometry() as GeoLine;
                point2Ds = geoLine[0];

                Point3Ds point3Ds = new Point3Ds();
                for(int j = 0; j < point2Ds.Count; j++)
                {
                    //double Z;
                    Point3D point3D = new Point3D(point2Ds[j].X, point2Ds[j].Y, 50);//50指高度值
                    point3Ds.Add(point3D);
                }
                geoLine3d.AddPart(point3Ds);
                recordsetResult.AddNew(geoLine3d);
                recordset.MoveNext();
                recordsetResult.MoveLast();
            }
            recordsetResult.Update();

            //// 关闭并释放记录集
            recordset.Close();
            recordset.Dispose();

            recordsetResult.Close();
            recordsetResult.Dispose();

编者:wzr

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值