背景:
在GeoEast系统中,三维层位采用与三维地震工区网格相同的栅格化文件存储。随着地震工区越来越大,三维层位文件也是随之变大。然而,在实际地震资料解释工作中,经过解释后的层位有效点,可能仅占层位数据很小的一部分,这对于层位数据的存储、传输及存取效率造成一定困扰。
图1:16*21大小的三维工区层位文件网格示例
如图1所示,工区网格为16*21(16行、21列),在每个格点上都存储一个实数值,用以表示该格点的层位时间,如果值为-9999,则表示该格点为无效值。GeoEast系统的三维层位文件在磁盘上存储时,是按照行列顺序依次将对应格点的实数值写入磁盘,即使是无效值也存入文件。而在实际生产中, 工区网格有可能很大(例如50000*50000),网格中往往含有的有效值较少(例如某些小的1000*1000区域内,或者不连续的随机网格区域),但是仍然占用了较多的磁盘空间,同时对层位文件的读取、网络传输的性能也带来不利影响。
已知:
1)一个三维地震工区网格数据(行列值);
2)一个GeoEast格式三维层位磁盘文件;
需求:
1) 设计一种新型层位文件存储格式,能有效降低磁盘占用量。每个层位数据文件,可以由一个或者多个磁盘文件组成;
2) 开发一个层位读写算法库,至少提供如下接口:(以C++语言示例,具体接口参数可调整,无效值均以-9999代替)
l ReadData(int minLine, int maxLine,int minCol, int maxCol,float *value)
读取指定矩形网格中所有的层位点数据。根据给定的最大最小行列号的值可以达到读取全部数据、某行数据和某列数据的目的。
l ReadPointsData(vector<NPoint> &data)
读取给定的任意多个格点的层位数据,其中NPoint是一个包含行(整型)、列(整型)、层位时间值(浮点型)三个成员变量的类(或结构体)。每个格点的行、列值由调用者设置,接口内将读取到的层位时间值填充到NPoint对应的变量中(该格点如果没有值,则填充为-9999)。
l WriteData(int minLine, int maxLine,int minCol, int maxCol,float *value)
将指定矩形网格中所有的层位点数据写入层位文件。value数组中包含所有格点的值(无效值以-9999代替)。
l WritePointsData(vector<NPoint> data)
将给定的任意多个格点的层位数据写入层位文件,其中NPoint是一个包含行(整型)、列(整型)、层位时间值(浮点型)三个成员变量的类(或结构体),每个格点的行、列、层位时间值由调用者设置,其中时间值可能为无效值-9999。
l 打开文件、关闭文件、网格行列数值设置等接口,可根据情况自行设定。算法库不需要提供源代码。
3) 利用实现的算法库,开发一个将GeoEast层位文件转换为新型存储格式层位文件的工具,并提供该工具源代码;
4) 提供例子代码,实现对上述接口的调用;
提供软件成果说明文档(含算法原理、软件设计、效果及程序员手册等);
评分标准:
序号 | 评分项目 | 分值 | 评分标准 |
1 | 空间指标 | 40 | ①采用网格大小和稀疏程度不同的多个层位数据进行测试,所占磁盘空间越小,得分越高。 |
2 | 时间指标 | 40 | ①采用网格大小和稀疏程度不同的多个层位数据对读写接口进行测试,所用时间越少,得分越高; |
3 | 程序算法 | 15 | ①算法先进 ②程序运行稳定、接口方便易用 |
4 | 文档指标 | 5 | ①软件原理、软件设计及程序接口用法说明清晰。 |