在超图的桌面产品中,包含了多种功能,其中也包括数据的基本处理功能。但是在各位伙伴在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