三维巷道与ArcEngine

采用面向对象的方法,设计了适合矿山三维巷道网络模型构建的三维数据模型及相应的三维数据结构。

自动建模方法,根据测量数据与参数提取出巷道特征点,通过函数连接特征点,完成巷道模型的绘制。但现有的自动建模法处理相交巷道时比较复杂,需要逐个计算巷道的交叉点,计算量比较庞大。

三维建模软件与组件技术二次开发相结合,利用三维建模软件创建模型,将模型格式转换成地理信息系统能识别的数据格式,然后调用地理信息系统可视化和空间分析功能。

数据结构和数据模型

数据模型是对客观事物及联系的描述,这种描述包括数据内容和各类实体数据之间联系的描述。而数据结构是数据模型的表示,是相互之间存在一种或多种特定关系的数据元素的集合,建立在数据模型基础之上,是数据模型的简化。

三维空间数据模型是研究三维空间几何对象的数据组织、操作方法以及规则约束条件等内容的集合。空间数据结构是指对描述空间实体的数据进行合理的组织,以便于进行计算机处理。

对于三维数据模型的表达就要用到三维数据结构,三维空间数据结构比较复杂,主要分为基于面的数据结构和基于体的数据结构。基于面的数据结构主要有格网结构、形状结构、面片结构、边界表实。基于体的数据结构主要有三维栅格数据结构、三维矢量数据结构、矢量栅格混合数据结构、面向对象的数据结构等。

2.1 三维空间数据模型和数据结构

由于现实世界的复杂性和应用领域的特殊性,对三维数据模型的研究很难得到一个通用的三维数据模型。不同的研究领域,空间对象在其形态、数据获取方法、描述方法和应用目的等方面存在较大差异,因此根据不同的研究领域和应用目的针对性幵展三维数据模型与建模方法的研宄,设计出专用的三维空间数据模型。

目前针对不同的空间现象,国内外学者提出了多种数据模型,从几何角度来看,三维空间数据模型可以归纳为表面模型、体元模型、混合模型等。

1. 表面模型是借助微小的面单元或面元素来描述物体的几何特性。主要包括格网结构(Grid),不规则三角网格网(TIN),边界表示(BR)和参数函数等。侧重于三维空间实体的表面表示,如地形表面、地质层面等。其优点是便于显示和数据更新,不足之处是难以进行空间分析。

2. 体元模型是用体元信息代替表面信息来描述对象的内部,是基于三维空间的体元分割和真三维实体表达。主要包括三维栅格(Array),八叉树(Octree),实体结构几何法(CSG),四面体格网(TEN)等。体模型侧重于三维空间实体的边界与内部的整体表示。易于进行空间操作和分析,但存储空间大,计算速度慢。

3. 混合模型目的是综合表面模型和体元模型的优点实现对三维空间对象的完整描述。常见的有TIN+栅格模型,TIN+CSG,TIN+OCTREE等。基于混合表示的数据模型有两种,即连接多种独立存在的数据模型的混合式数据模型和从数据结构设计上考虑两者的集成的集成式数据模型。混合模型在使用上有一定的局限性。

从数据描述格式来看,又可分为矢量、栅格、矢量与栅格集成三种。此外三维空间数据模型还可以从拓扑关系、面向对象方法描述两个方面进行考虑。当然只有矢量数据结构的模型才具有拓扑数据模型的特点,而面向对象的数据模型是一种建立概念模型的方法,它可以同时包容矢量和栅格两种数据结构以及不同的空间对象。因此可以将三维空间数据模型从几何特征、数据描述格式两条轴线来加以考虑,而不将面向对象的数据模型单独提出进行讨论。

表2 三维空间数据模型分类

对于表达复杂体模型,尤其是需要三维可视化、拓扑分析、空间査询、网络分析等功能的矿山领域,适用基于矢量或面模型比较方便。它是用一些基元及其组合来表示三维空间对象,是二维中点、线、面矢量模型在三维中的推广。

三维矢量数据结构

可以认为所有复杂目标都是由各种空间体域构成的,而体由曲面构成,进而面由弧、弧由点构成,从而可形成“复杂地物一体一曲面一环一弧一结点”的拓扑关系表达。

巷道建模自动化

对于断面形状的表达需要断面关键点的坐标,关键点的坐标可以通过断面属性数据计算得到。由于巷道断面多是曲面,需要对曲面进行离散化处理,然后利用线段逼近的方法进行表达。可以根据精度的需要把曲面分为不同个数的线段来逼近。基于此才能充分拟合巷道断面形状。

根据三维巷道数据模型可以将组成对象之间的拓扑关系归纳为以下几种类型:巷道网络模型一复合巷道体关系;复合巷道体一简单巷道体、复杂巷道体关系;复杂巷道体一简单巷道体复合巷道体关系;简单巷道体一复杂巷道体一巷道断面复合巷道体关系;根据拓扑关系,设计数据结构如表3-10。

巷道的分类

按其空间位置分为:直立巷道、水平巷道、倾斜巷道和井下硐室。

按巷道模型分类:

由图可知,可以将巷道网络模型分解成没有分支的直巷道体、没有分支的拐角体和有不同分支的巷道体。本文将直巷道体模型称作简单巷道体,将拐角体和有分支的巷道体统称为复杂巷道体。

ArcGIS Multipatch模型

从理论上讲,对任意的三维物体,只要它满足一定的条件,我们总可以找到一个合适的平面多面体来近似地表示这个三维物体,且使误差保持在一定的范围内。巷道的空间形态是一种基本规则的人工建筑物体,其主要的构造特征都可以体现在其构造面上,是典型的面模型。因此,可以通过对其特征点联结,采用线框构模法进行巷道体各个表面三角网的构建。

TriangleStrip几何对象是由一系列点定义的曲面片组成,而曲面片是由若干个三角形所组成,每一个新的三角形都是通过连接前一个三角形的两个顶点形成的。TriangleFan几何对象是由一系列三维三角形组成的连续扇形,第一个点定义为顶点或者起点,所有的三角形共享这个顶点,新的三角形是通过连接顶点、前一个三角形的点和该三角形的点组成的。

Triangle几何对象由连续的三个点连接形成。图中三角形曲面由(0,1,2),(3,4,5)点集来定义。Ring是一个封闭路径构成的多边形,定义一个MultiPatch表面时,所有的Ring都具有相同的结构,只是每个Ring扮演各自不同的角色。根据Ring本身的属性,所扮演的角色有:Outer ring表示外环或外多边形环;Inner ring表示内环或内孔的多边形;First ring是指定的第一个多边形;Ring未指明类型的一个多边形。外环和内环都是有方向的,它们的区别是外环方向是顺时针方向的,图8中由(0,1,2,3)定义,内环方向是逆时针的,图中由(4,5,6,7)点集来定义。

本文三维巷道模型是基于结点插入断面的方法生成的线框模型。简单巷道体是相邻结点加载断面,连接断面对应的特征点完成模型构建,对于复杂巷道体模型也是通过加载过渡断面的方法生成的。因此本文提出的构模算法适合使用TriangleStrip几何对象进行描述。

Multipatch模型的创建方法

可以通过多种方式创建,一种是通过导入外部格式数据文件(3D Studio Max.3ds files,OpenFlight.flt files,COLLADA.dae files,Sketchup.skp files,VRML.wrl files);另一种是通过某些地理处理工具;另外也可以使用ArcGIS Engine提供了多种创建Multipatch几何对象的方法。

通过IConstructMultiPatch接口和IExtrude接口操作GeometryEnvironment对象可以通过拉伸Polyline对象和Polygon对象来创建Multipatch。

通过访问3D符号库,获取3DSymbol来渲染点,把三维符号放置在点的位置从而生成Multipatch。

如果创建没有贴图纹理、没有法向、没有组成部分信息的Multipatch时,只需创建组成Multipatch各个部分即可,然后通过Multipatch的IGeometryCollection接口添加各个组成部分。

而如果要为Multipatch每个组成部分添加纹理信息,法向信息,属性信息就必须使用GeneralMultiPatchCreator对象来创建,通过其IGeneralMultiPatchInfo接口来为Multipatch各个组成部分定义法向、材质、属性信息。通过该接口可以获取这些组成部分的信息。

Multipatch中的每一部分有几个附加属性:组成部分的类型(Type),如TriangleStrip、Ring等;组成部分的优先级(Priority),用于控制重叠部分绘制的顺序;组成部分使用的材质的索引号,该部分使用的材质在整个材质数组中的序号。

自动化建模步骤

三维巷道模型构建的流程如下:首先读取中线点坐标数据,生成巷道中线网络图,判断中线点连接、各对象拓扑关系是否正确,对错误数据进行修正。其次采取分层建模的方法,按照巷道名称对巷道网络进行遍历,对每条巷道采用自动生成插入点的方法,生成该条巷道的插入点点集。相邻插入点生成直巷道体,节点处根据交点属性值生成相应的复杂巷道体。在插入点处与简单巷道体进行无缝拼接,组合成该条巷道三维模型。重复上述步骤完成其他巷道的三维模型构建,最终根据拓扑关系完成整个三维巷道网络模型的拼接。

简单巷道体建模

简单巷道体是单一的没有分支的巷道,是巷道类型中最为简单、最为普遍的一种,可以简单的理解为直巷道体。可以由起始断面和终止断面确定。

拱形断面直巷道体的建模

private IGeometry ArchStrip1(IPoint fromPoint, IPoint toPoint, double R, double H, IVector3D vector, double S, double angle){
  IVector3D cross = vector.CrossProduct(VectorZ) as IVector3D;
  IMultiPatch pMultiPatch = new MultiPatchClass();
  IGeometryCollection pGeoCol = pMultiPatch as IGeometryCollection;
  IPointCollection pPnts = new TriangleStripClass();
  for(int i=0;i<=11;i++)
  {
    cross.Rotate(Math.PI/12, vector);
    cross.Magnitude = R;
    IPoint pt1 = PntCross(fromPoint, cross);
    pPnts.AddPoint(pt1);
    IPoint pt2 = PntCross(toPoint, cross);
    pPnts.AddPoint(pt2);
  }
  cross.Rotate(angle, vector);
  cross.Magnitude = S;
  IPoint pt11=PntCross(fromPoint, cross);
  pPnts.AddPoint(pt11);
  IPoint pt21 = PntCross(toPoint, cross);
  pPnts.AddPoint(pt21);
  cross.Rotate((Math.PI/2-angle,vector);
  IPoint pt12=PntCross(fromPoint, cross);
  pPnts.AddPoint(pt12);
  IPoint pt22=PntCross(toPoint, cross);
  pPnts.AddPoint(pt22);
  pGeoCol.AddGeometry(pPnts as IGeometry, ref object, ref object);
}

圆形断面直巷道体的建模

对于圆形断面直巷道体的建模较拱形建模方法更为简单,直巷道体中线点位于圆形断面的圆心处。由起止插入点坐标数据、插入点连线向量vector以及圆形半径即可求得圆形断面上所有特征点。方法与求拱形断面拱顶离散点相同。求得向量vector和X轴向量所在平面的法向量,以vector向量为旋转轴,半径R为步长,每旋转15°得到一个离散点,旋转24次,得到断面全部离散点。

Private IGeometry CircleStrip1(IPoint fromPoint, IPoint toPoint, double R, IVector3D vector)
{
  IVector3D cross = vector.CrossProduct(VectorX) as IVector3D;
  IMultiPatch pMultiPatch = new MultiPatchClass();
  IGeometryCollection pGeoCol = pMultiPatch as IGeometryCollection;
  IPointCollection pPnts = new TriangleStripClass();
  for(int i=0;i<=24;i++)
  {
    cross.Rotate(Math.PI/12, vector);
    cross.Magnitude = R;
    IPoint pt1 = PntCross(fromPoint, cross);
    pPnts.AddPoint(pt1);
    IPoint pt2 = PntCross(toPoint, cross);
    pPnts.AddPoint(pt2);
  }
  pGeoCol.AddGeometry(pPnts as IGeometry, ref object, ref object);
}

复杂巷道体建模

复杂巷道体主要可以分为两类:一类是拐角巷道体,主要出现在弯曲巷道的拐弯处;另一类是夹角巷道体,一般作为盆口处巷道拼接模型,由多个夹角部分组合成夹角巷道体。

对于交岔点的建模根据交岔点类型选择相应数目夹角巷道体进行拼接,组合成完整的交岔点模型,进而与相连的直巷道体无缝对接,完成模型的构建。由于夹角巷道体模型结构是相同的,只需要设置不同参数就可以满足建模,不仅使建模效率得到提高,还可以实现建模过程的自动化。

拐角巷道体建模

程序的设计

三维巷道自动化建模实验系统主要功能模块有:数据管理模块、文件管理模块、三维建模模块和三维可视化模块。

工作空间工厂WorkspaceFactory对象是GeoDatabase的入口,是一个抽象类,拥有很多子类,例如SdeWorkspaceFactory,AccessWorkspaceFactory,ShapefileWorkspaceFactory,CadWorkspaceFactory等。不同类型的空间数据需要不同的工作空间工厂对象来打开一个工作空间。
工作空间对象代表了一个Geodatabase或一个ArcInfo coverage工作空间或一个文件夹,在逻辑上是一个包含空间数据集和非空间数据集的数据容器,这些数据包括要素类、栅格数据集、表等对象。
IFeatureWorkspace接口主要用于管理基于要素的数据集,如表(Table)、对象类(ObjectClass)、要素类(FeatureClass)、要素数据集(FeatureDataset)和关系类(RelationshipClass)等。
要素类FeatureClass是一种可以存储空间数据的对象类,它是对象类的扩展,其定义中包含几何字段;Feature要素是要素类的一条记录,它是一个有几何字段的对象。

原文地址:https://www.cnblogs.com/2008nmj/p/14303722.html