河南理工大学硕士学位论文
double bottom //外包矩形右上角y坐标 DWORD data //对象数据 HANDLE hSymBuff //填充符号数据句柄 BOOL bDisThick //是否显示地层厚度 double symVerticalSpace //垂向符号间距 double symhorizontalSpace //纵向符号间距 double ineWidth //线宽
HANDLE hLeft //左侧关联实体句柄 HANDLE hRight //右侧关联实体句柄 HANDLE hUp //上部关联实体句柄 HANDLE hDown
//下部关联实体句柄
int nCoCount //底板数据点数 STRATUMBOTTOM sbData[nCoCount] //底板数据 }
由上述地质对象实体的数据结构可以看出,这些基本实体类型之间通过拓扑关系紧密联系在一起。例如在结点的数据结构中,我们通过相关联的弧段句柄记录了与之相关联的所有弧段;在弧段的数据结构中,通过始结点句柄、终结点句柄和左区句柄、右区句柄分别记录了组成弧段的两个结点和与之相关联的两个区;在区的数据结构中,通过外区相关联的弧段句柄记录了与之相关联的所有外部区,而内区数据句柄则记录了与之相关联的所有内部区,并在内多边形数据结构中通过内区弧段句柄数组记录了组成每个内部区的所有弧段。当内区个数为一时,即为该区本身。在地层的数据结构中,通过左侧关联实体句柄、右侧关联实体句柄、上部关联实体句柄、下部关联实体句柄分别记录了与之相关联的左侧断层、右侧断层和上部地层、下部地层。
利用这些基本地质对象实体之间的这种拓扑关系,我们就可以有效地表达矿井采掘衔接图绘制系统中所有地质对象实体之间的空间拓扑关系,如点线关系、点面关系、线线关系、线面关系以及地层之间、地层与断层之间的关系等等。
3.4 本章小结
本章首先重点分析了矿井采掘衔接图所涉及地质对象的基本特征,并针对矿
28
第3章 矿井采掘衔接决策支持系统的数据模型和数据结构
井采掘衔接图所涉及地质对象的特殊性和复杂性,提出了适合描述矿井地质对象的面向对象数据模型,并在此基础上系统设计了点、直线、折线、圆弧、圆、椭圆、椭圆弧、多边形、面、结点、弧段、区、注记和地层等十四种基本空间地质对象实体类型的数据结构。
29
河南理工大学硕士学位论文
30
第4章 矿井采掘衔接决策支持系统的关键技术和方法研究
4矿井采掘衔接决策支持系统的关键技术和方法研究
4.1面向对象的内存管理方法
煤矿的地质条件复杂,信息化涉及的数据量非常大,以一个典型的矿区为例,由于包含众多的图形元素,数据量往往达到几十兆,如果加上与之相关的属性信息,那将达到上百兆。随着“数字煤矿”战略的实施,数据量将进一步的增加。如何快速访问更新并共享如此大量的数据成为影响系统性能的重要问题。在计算机硬件性能一定的情况下,优化内存管理策略成为提升软件性能的一个重要途径。
Windows操作系统给开发者提供了多种管理内存的选择,如图4-1所示:
Layered Memory Management in Win32Win32 ApplicationLocal, Global Memory APICRT Memory FunctionsMemory Mapped File APIHeap Memory APIVirtual Memory APINT Virtual Memory ManagerWin32 SubsystemNT KernelPhysical Memory
PC Hard Disk(s) 图4-1 Windows内存管理结构
Fig 4-1 The structure of memory management in Windows
传统的煤矿专业GIS平台往往采用最上层的局部和全局的内存管理函数(Local, Global Memory API)或者Microsoft CRT(C Run-time)函数库来管理内存,这种策略对于开发者来讲,优点是将具体的实现细节交给操作系统处理,简单实用,但同时带来灵活性不够、效率不高的问题,无法充分考虑煤矿专业GIS平台的特殊性。
针对煤矿空间数据量大、对内存容量要求高的特点,为了提高性能与灵活性,系统以底层的虚拟内存函数库(Vitual Memory API)以及内存映射函数库(Memory Mapped File API)为基础,将硬盘上的临时文件映射为虚拟内存,作为煤矿专业GIS
31
河南理工大学硕士学位论文
平台专有的存储区,采用面向对象的管理方式负责内存的分配、读写,并利用虚拟内存的特性,达到进程间数据共享的目的。
为了完成硬盘临时文件到虚拟内存的映射,系统煤矿专业GIS平台提供了CMapFile类,它主要实现以下功能:建立文件到内存的映射,关闭内存映射,向内存映射文件中写数据,同步虚拟内存与文件中的数据等等。
而且,为了便于管理,系统将内存区块划分成三种类型:索引内存块、标准内存块和扩展内存块:
(1)索引内存块
索引内存块只能由系统使用,用户无法访问,存储已有内存对象的信息。其结构见表4-1所示:
表4-1 索引内存块结构
Table 4-1 The structure of index memory
内存缓冲区首地址=mBuff mBuff +sizeof(int) mBuff +sizeof(int)+sizeof(HANDLE) mBuff +sizeof(int)+2*sizeof(HANDLE) mBuff +sizeof(int)+3*sizeof(HANDLE)
mBuff + bSize - sizeof(HANDLE) mBuff +sizeof(int)+4*sizeof(HANDLE) 区块大小=bSize,int类型 父块句柄=NULL,HANDLE类型 未使用内存区句柄,HANDLE类型 回收站句柄,HANDLE类型 回收站最后一个区块的句柄,HANDLE类型 未使用的空间 空间大小=bSize-sizeof(int)- 2*sizeof(HANDLE) 子块句柄,HANDLE类型 说明:
① 索引内存块在内存缓冲区内只有一个,而且位于内存缓冲区的最开始的部位;
② 索引内存块没有父块(父块句柄=NULL);
③ 未使用内存区指的是内存缓冲区内从未被使用过的内存区域。当用户需要申请新的内存区块时,系统首先从回收站中寻找。如果回收站中有满足要求的内存区块,则从回收站中取出交给用户使用;如果没有的话,系统依据未使用内存区句柄,新建满足要求的内存区块,交给用户使用。这里的未使用内存区句柄,
32