类型转换是大家在日常工作中经常用到的功能,特别是二维面转三维面的功能。面数据相对于线数据较为复杂,可能是具有子对象的导洞多边形,那对于这种数据转换的思路又是什么呢?.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();