"东方杯"全国大学生勘探地球物理软件开发大赛

三维层位数据高效存取

发布时间:2023-05-04浏览次数:432

背景:

GeoEast系统中,三维层位采用与三维地震工区网格相同的栅格化文件存储。随着地震工区越来越大,三维层位文件也是随之变大。然而,在实际地震资料解释工作中,经过解释后的层位有效点,可能仅占层位数据很小的一部分,这对于层位数据的存储、传输及存取效率造成一定困扰。

116*21大小的三维工区层位文件网格示例

如图1所示,工区网格为16*2116行、21列),在每个格点上都存储一个实数值,用以表示该格点的层位时间,如果值为-9999,则表示该格点为无效值。GeoEast系统的三维层位文件在磁盘上存储时,是按照行列顺序依次将对应格点的实数值写入磁盘,即使是无效值也存入文件。而在实际生产中, 工区网格有可能很大(例如50000*50000),网格中往往含有的有效值较少(例如某些小的1000*1000区域内,或者不连续的随机网格区域),但是仍然占用了较多的磁盘空间,同时对层位文件的读取、网络传输的性能也带来不利影响。

已知:

1)一个三维地震工区网格数据(行列值);

2)一个GeoEast格式三维层位磁盘文件;

需求:

1)   设计一种新型层位文件存储格式,能有效降低磁盘占用量。每个层位数据文件,可以由一个或者多个磁盘文件组成;

2)   开发一个层位读写算法库,至少提供如下接口:(以C++语言示例,具体接口参数可调整,无效值均以-9999代替)

l  ReadData(int minLine int maxLineint minCol int maxColfloat *value)

读取指定矩形网格中所有的层位点数据。根据给定的最大最小行列号的值可以达到读取全部数据、某行数据和某列数据的目的。

l  ReadPointsData(vector<NPoint> &data)

读取给定的任意多个格点的层位数据,其中NPoint是一个包含行(整型)、列(整型)、层位时间值(浮点型)三个成员变量的类(或结构体)。每个格点的行、列值由调用者设置,接口内将读取到的层位时间值填充到NPoint对应的变量中(该格点如果没有值,则填充为-9999)。

l  WriteData(int minLine int maxLineint minCol int maxColfloat *value)

  将指定矩形网格中所有的层位点数据写入层位文件。value数组中包含所有格点的值(无效值以-9999代替)。

l  WritePointsData(vector<NPoint>  data)

将给定的任意多个格点的层位数据写入层位文件,其中NPoint是一个包含行(整型)、列(整型)、层位时间值(浮点型)三个成员变量的类(或结构体),每个格点的行、列、层位时间值由调用者设置,其中时间值可能为无效值-9999

l  打开文件、关闭文件、网格行列数值设置等接口,可根据情况自行设定。算法库不需要提供源代码。

3)   利用实现的算法库,开发一个将GeoEast层位文件转换为新型存储格式层位文件的工具,并提供该工具源代码;

4)   提供例子代码,实现对上述接口的调用;

提供软件成果说明文档(含算法原理、软件设计、效果及程序员手册等);

评分标准:

序号

评分项目

分值

评分标准

1

空间指标

40

采用网格大小和稀疏程度不同的多个层位数据进行测试,所占磁盘空间越小,得分越高。

2

时间指标

40

采用网格大小和稀疏程度不同的多个层位数据对读写接口进行测试,所用时间越少,得分越高;

3

程序算法

15

①算法先进

程序运行稳定、接口方便易用

4

文档指标

5

软件原理、软件设计及程序接口用法说明清晰。