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

类型转换是大家在日常工作中经常用到的功能,特别是二维面转三维面的功能。面数据相对于线数据较为复杂,可能是具有子对象的导洞多边形,那对于这种数据转换的思路又是什么呢?.NET组件中对于二维面转三维面没有直接的接口,小编就整理了二维面转三维面的思路与代码供大家参考。

子对象信息可以在桌面iDesktop中,右键属性查看,本例如下图:

注意!!!:如果想要生成三维面以后加载到场景里面,还是导洞多边形的样子,就需要导洞多边形的内外面节点绘制方向相反。例如:外面那个多边形是顺时针绘制,里面的多边形则要逆时针绘制。如不满足这种条件,加载到三维场景以后会出现以下情况: 

二维面转三维面大致思路:

1.新建三维面数据集,并定义坐标系

2.获取二维记录集recordset

3.遍历二维面记录集,并将节点信息更新到三维面记录集

        3.1遍历recorset中的子对象(如果子对象为1,则循环一次,构建geoRegion3D完成;如果子对象不为1,则循环二维子对象信息,并存入geoRegion3D)

                3.1.1获取二维单个面对象中所包含的点对象point2Ds ,并将其存入point3Ds

                3.1.2通过point3Ds构造GeoRegion3D

        3.2将geoRegion3D更新到recordset3D中

4.关闭释放

具体的实现思路如下:

创建三维面数据集
 

                // 设置三维面数据集的信息
                DatasetVectorInfo datasetVectorInfo = new DatasetVectorInfo();
                datasetVectorInfo.Type = DatasetType.Region3D;
                datasetVectorInfo.IsFileCache = true;
                datasetVectorInfo.Name = txbResultDataSet.Text.ToString();
                // 创建三维面数据集
                m_datasource = m_workspace.Datasources[cmbResultDatasourse.SelectedItem.ToString()];
                m_datasource.Datasets.Create(datasetVectorInfo);
                Dataset dataSet3D = m_workspace.Datasources[cmbResultDatasourse.SelectedItem.ToString()].Datasets[txbResultDataSet.Text.ToString()];

 获取三维记录集并定义坐标系

                //获取三维面记录集recordset
                SuperMap.Data.DatasetVector datasetVector3D = dataSet3D as SuperMap.Data.DatasetVector;
                Recordset recordset3D = datasetVector3D.GetRecordset(false, CursorType.Dynamic);
                //重新定义坐标系
                PrjCoordSys prjCoordSys = dataset.PrjCoordSys;
                datasetVector3D.PrjCoordSys = prjCoordSys;

获取二维面记录集

                Recordset recordset = dataset.GetRecordset(false, CursorType.Dynamic);
                recordset.MoveFirst();

遍历二维面记录集,将GeoRegion转换为GeoRegion3D,并存入三维面记录集中

                string Z = cmbZ.SelectedItem.ToString();
                SuperMap.Data.GeoRegion m_geoRegion;
                //遍历二维面记录集recordset,并将节点信息更新到三维面记录集recordset3D
                for (int k = 0; k < recordset.RecordCount; k++)
                {
                    SuperMap.Data.Geometry geo = recordset.GetGeometry();
                    m_geoRegion = geo as SuperMap.Data.GeoRegion;
                    Point3Ds point3Ds = new Point3Ds();
                    GeoRegion3D geoRegion3D = new GeoRegion3D();
                    //遍历循环子对象,单个对象默认只有1个子对象;
                    for (int i = 0; i < m_geoRegion.PartCount; i++)
                    {
                        point3Ds = new Point3Ds();
                        //遍历单个面对象中所包含的点对象 ,并将其存入point3Ds
                        for (int j = 0; j < m_geoRegion[i].Count; j++)
                        {
                            Point3D point3D = new Point3D();
                            point3D.X = m_geoRegion[i][j].X;
                            point3D.Y = m_geoRegion[i][j].Y;
                            point3D.Z = Convert.ToDouble(recordset.GetFieldValue(cmbZ.SelectedItem.ToString()));
                            point3Ds.Add(point3D);
                        }
                        if (i == 0)
                        {
                            geoRegion3D = new GeoRegion3D(point3Ds);//第一次循环时构建三维面
                        }
                        else
                        {
                            geoRegion3D.AddPart(point3Ds);//向三维面几何对象中添加一个子对象 
                        }
                    }
 
                    recordset.MoveNext();
                    recordset3D.AddNew(geoRegion3D);
                    recordset3D.Update();
                }
 

总代码如下:

                // 设置三维面数据集的信息
                DatasetVectorInfo datasetVectorInfo = new DatasetVectorInfo();
                datasetVectorInfo.Type = DatasetType.Region3D;
                datasetVectorInfo.IsFileCache = true;
                datasetVectorInfo.Name = txbResultDataSet.Text.ToString();
                // 创建三维面数据集
                m_datasource = m_workspace.Datasources[cmbResultDatasourse.SelectedItem.ToString()];
                m_datasource.Datasets.Create(datasetVectorInfo);
                Dataset dataSet3D = m_workspace.Datasources[cmbResultDatasourse.SelectedItem.ToString()].Datasets[txbResultDataSet.Text.ToString()];
 
                //获取三维面记录集recordset
                SuperMap.Data.DatasetVector datasetVector3D = dataSet3D as SuperMap.Data.DatasetVector;
                Recordset recordset3D = datasetVector3D.GetRecordset(false, CursorType.Dynamic);
                //重新定义坐标系
                PrjCoordSys prjCoordSys = dataset.PrjCoordSys;
                datasetVector3D.PrjCoordSys = prjCoordSys;
 
                Recordset recordset = dataset.GetRecordset(false, CursorType.Dynamic);
                recordset.MoveFirst();
 
                string Z = cmbZ.SelectedItem.ToString();
                SuperMap.Data.GeoRegion m_geoRegion;
                //遍历二维面记录集recordset,并将节点信息更新到三维面记录集recordset3D
                for (int k = 0; k < recordset.RecordCount; k++)
                {
                    SuperMap.Data.Geometry geo = recordset.GetGeometry();
                    m_geoRegion = geo as SuperMap.Data.GeoRegion;
                    Point3Ds point3Ds = new Point3Ds();
                    GeoRegion3D geoRegion3D = new GeoRegion3D();
                    //遍历循环子对象,单个对象默认只有1个子对象;
                    for (int i = 0; i < m_geoRegion.PartCount; i++)
                    {
                        point3Ds = new Point3Ds();
                        //遍历单个面对象中所包含的点对象 ,并将其存入point3Ds
                        for (int j = 0; j < m_geoRegion[i].Count; j++)
                        {
                            Point3D point3D = new Point3D();
                            point3D.X = m_geoRegion[i][j].X;
                            point3D.Y = m_geoRegion[i][j].Y;
                            point3D.Z = Convert.ToDouble(recordset.GetFieldValue(cmbZ.SelectedItem.ToString()));
                            point3Ds.Add(point3D);
                        }
                        if (i == 0)
                        {
                            geoRegion3D = new GeoRegion3D(point3Ds);//第一次循环时构建三维面
                        }
                        else
                        {
                            geoRegion3D.AddPart(point3Ds);//向三维面几何对象中添加一个子对象 
                        }
                    }
 
                    recordset.MoveNext();
                    recordset3D.AddNew(geoRegion3D);
                    recordset3D.Update();
                }
 
                recordset.Close();
                recordset.Dispose();
                recordset3D.Close();
                recordset3D.Dispose();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值