左半边 发表于 2013-3-13 19:39:46

从ArcGIS 平面栅格图形到Gocad三维图像转换的开发探讨(下)

Set pOrigin = New DblPntpOrigin. SetCoords 1 , 1
Set pSize = New DblPnt
pSize. SetCoords count row , countcolumn
Set pRaster = InputLayer. Raster ??(1)
Set p PixBlk = pRaster. CreatePixelBlock
(pSize)
pRaster. Read pOrigin , p PixBlk ??(2)上面的代码中pOrigin 和pSize 是IPnt 接口类型的变量,p PixBlk 是PixelBlock 类型的变量,InputLayer 是所输入的IRasterLayer 接口类型的变量。通过标注为(1) 的语句就得到了栅格图层中所有栅格对象,从而通过标注为(2) 的语句读取出所有网格中的属性值,将他们存放到大小为count row ×countcolumn 的象素容器中,然后调用PixelBlock 的成员函数GetVal () 取出所需点的属性值。再根据上面所得到的整个栅格图形的实际坐标范围就能确定出每个网格的实际坐标和所对应的属性值。其中值得注意的是所获得的栅格图形的坐标轴方向(图2) 和PixelBlock 中数据存储顺序(图3) 存在一定的关系。
图2 表示ArcGIS 中的一张栅格图形在屏幕上显示的时候其坐标的范围。图形的相对坐标起点是坐下角,即( Xmin , Ymin) , X 轴向右为增加的方向, Y 轴向上为增加的方向。图3 是图2 的属性值在PixelBlock 中的存储矩阵。其起点是左上角,向下为行增加的方向,向右为列增加的方向。根据他们之间存在的这种关系,将上面得到的每个单元格中的属性值,连同它的坐标一起输出就得到了所要中间数据文件。4  将数据转化成Gocad 的曲面对象       为了将空间坐标数据文件转化成Gocad 的曲面对象,首先需要将空间坐标转化成Gocad 的空间点对象,然后由点对象构成曲面对象。Gocad中三维空间点是用Point3d 类来控制的,因此可以首先声明一个Point3d 类型的变量,然后利用它的构造函数就可以创建出三维空间点,例如:Point3d m- Point = Point3d ( x , y , z ) 。但是Point3d 类型的对象不能直接作为点对象显示在Gocad 中,在Gocad 用户界面中作为三维空间中的点是以Point set 形式出现的,而在程序开发中,Point set 所对应的是Vset 的对象,因此必须创建set 类的对象。在创建Vset 对象之前,必须先创建Atom 类
的对象,然后通过Atom 类的对象去构建Vset 的对象。Atom 即原子是带属性的三维空间点,当然也可以不设置属性。因此可以通过三维空间点Point3d 来创建Atom 的对象,例如:Atom 3 atom ;
PLine 3 pline = static-cast ( PLine ,
GeobaseLib: : instance ( ) - > create ( ”pline ”,
PLine : :id() ) ) ;
ILine 3 iline = pline - > create-element() ;/ / 创建一个ILine
atom = iline - > create-atom( m- Point) ;/ / 用于构造出原子      接下来通过创建好的atom 原子对象来创建在Gocad 中能看见的带属性的三维空间点即VSet 的对象。
VSet vset ;
vset . set- name (savename) ;
SubVSet 3 subvset = vset . create-element () ;
subvset - > add-atom(atom) ;
vset . add(subvset) ;/ / 添加到VSet 中         上面这段代码先定义了一个VSet 类型的对象,然后为VSet 的对象设置一个名字,通过该对象创建其子类SubVSet 的对象指针subvset ,然后将上面的原子加入到其中,即创建一个subvset 对象,最后将VSet 子类的对象subvset 加入到VSet中就可以了。这样一个不含属性的三维空间点就创建成功了。当然VSet 就相当于Gocad 用户界面中看到的PointSet ,VSet 表示带属性的三维空间点的集合,而SubVSet 是VSet 子类,表示一个个带属性的三维空间中的点。       利用创建好的带属性的三维空间点就可以进行面(Surface) 的创建了。面(Surface) 的创建有很多种方法,例如:可以直接通过三维空间点来创建,也可以通过面的边界以及面内部的控制点来建,还可以通过多边形框架来创建等等。由于ArcGIS 的栅格图形是规则的矩形,而且每个单元格的坐标都已经知道,因此可以采用第一种方法即用三维空间中的点来创建Gocad 的面。例如下面的程序代码就实现了面的创建。 TSurf 3 mysurf ;
mysurf = tsurf : : create-f rom-atomic-group
( savename , (AtomicGroup 3 ) &vset , t rue , Vec2
tor3d (0 ,0 ,0) ,t rue ) ;         最后要做的工作就是,保存上面建立的带属性的三维空间曲面,以使得Gocad 能将建立好的三维空间曲面对象载入并显示在屏幕上。可以通过下面的代码来实现对象的保存。
GObj 3 group = ( GObj 3 ) mysurf
gobj : :save (group) ;
         以上过程是将空间坐标数据转化成Gocad 的空间曲面对象。5  应用实例      图4 是一张在ArcGIS 中显示的地形图,从中可以看出,在ArcGIS 中Raster 图形只能以平面图形的形式显示出来。现在需要将它转化后在Gocad 中以空间曲面的形式显示出来。利用上面的程序流程就可以将ArcGIS 中的Raster 图形(图4) 转换成Gocad 中的空间曲面图形(图6) 。图5 是图4 (ArcGIS 中的Raster 图形) 经过转换后,在Gocad 中以网格形式显示的图形。图6 是同一张Raster 图像(图4) 在Gocad 中以空间曲面的形式显示,其中的颜色的变化代表高程的变化。
       图7 是图6 经过旋转后得到的图形。从ArcGIS的平面栅格图形到在Gocad 中的三维曲面图形,从中可以明显地感受到其空间三维立体感的巨大差别。此外在Gocad 中还可以实现图形的任意旋转、放大和缩小,可以从任意角度查看和分析图形,更有利于判别空间地质体的形态和构造,为进一步做出准确的地质解释提供有利的条件。          6  结 论
      经过二次开发程序转换后的Raster 图形更能突出其三维图形的特征,能让人更直观地感受到现实世界中地质体的空间形态,并且在Gocad中可以方便地查看任何一个点的坐标、高程以及属性数据。转化后的图形可以任意放大和缩小,即从ArcGIS 的栅格图形转化成了Gocad 的标准矢量图形,还能任意旋转图形,更加给人以三维空间直观的感觉,能让人从整体上建立空间三维地质体的概念。而且Gocad 中提供了大量对空间三维地质图形进行地质分析的工具,更有利于地质体结构、构造的判别。          此外通过对ArcGIS 和Gocad 的二次开发,不仅可以将ArcGIS 中的Raster 平面图转化到Go2cad 中以三维曲面显示, 并且还能将ArcGIS的Shape 文件,以及由TIN 构成的“伪三维”图形文件转化到Gocad 中以真三维图形显示出来。由于篇幅有限,对于Shape 和TIN 文件的转化就不做过多的介绍。参考文献:
党安荣,贾海峰,易善桢,等. ArcGIS8 Desktop 地理信息系统应用指南 . 北京:清华大学出版社,2003.
104 —106.
刘光. 地理信息系统二次开发教程组件篇 . 北京:清华大学出版社,2003. 1 —15.
[ 3 ] 杨朝辉,徐秀萍,党立华. 基于ArcObjects 的地形三维可视化分析系统的研制 . 海洋测绘,2003 ,23 (6) :
41 —44.
[ 4 ] 吴立新,史文中,ChristoperGold. 3DGIS 与3DGMS 中的空间构模技术 . 地理与地理信息科学,2003 ,19
(1) : 5 —11.
祝建荣,李行. 三维模型在采矿中的应用 . 有色矿山,1994 , (5) :56 —59.

页: [1]
查看完整版本: 从ArcGIS 平面栅格图形到Gocad三维图像转换的开发探讨(下)