格点数据存储数据库设计(PG和MYSQL)
设计目的:
格点数据是一种常见的数据类型,包括的数据有很多种类,实况格点,数值预报,人影模式等;典型如气象领域的nc与Grib/Grib2文件。本文基于PostgreSQL数据库进行设计,PG数据库是一个TP与AP都比较强势的混合型数据库,特性多功能强黑科技丰富。在实际的应用过程中,格点数据文件按照时间、要素、气压层等分布繁多,不利于我们对固定点线面的查询统计和分析。直接读取文件耗时较长,不利于实时的交互。解决这一系列问题,将格点数据入库存储。
格点数据介绍:
格点文件是多维数据集,文件内部根据维度组合由多个格网平面数据组成,通过“四维”能唯一描述某一个格网平面。
格点数据是典型的多维数据集,打开任何格点数据文件,如下图示意:
nc文件文件都会显示列出(要素),时间,空间维度信息,不同维度组合能得到不同的格网平面数据,因此一个格点文件是由多个不同格网平面数据组成的。概括来说,格点文件维度信息主要由“四维”构成,说明如下:
- 物理量:或称“要素”,如风、温、湿、压等等。
- 高度:比如地面风,高空1000米风,高空2000米风等,通常需要高度维度记录不同高度的气象信息。
- 时间:必须有起报时间、预报时刻的时间维度,表达数据的时间特性。
- 平面地理位置:描述格网的起始地理经纬度,终止地理经纬度代表的地理范围,也就是和GIS里常用的BBOX概念是一个意思。
格点元数据
格网本身是有两部分组成:元数据+格点数组,元数据会定义格网的维度特征,例如包括格网的起点经纬度Start,终点经纬度End,除此之外包括一些其他重要信息,如每个格点(小方格就是格点)的宽高(一般都相等)res_x,res_y,宽就是水平方向的分辨率,高就是垂直方向的分辨率,一个格点文件内的格网平面会共享部分重要元数据,列表信息如下:
- 起始经度
- 起始纬度
- 终止经度
- 终止纬度
- 水平分辨率
- 垂直分辨率
- 格网宽度
- 格网高度
同时,不同格网平面自身会根据“四维”参数不同,有自己的独享元数据,列表信息如下:
- 物理量名称
- 起报时间
- 预报时刻
- 格网高度
元数据与格点值数组之间存在很多计算关系。
观察上图可知,格网的宽高是由地理范围和格点分辨率决定的,计算公式如下:
格网宽=(End.x-Start.x)/res_x;
格网高=(End.y-Start.y)/res_y;
格点总数 = 格网宽*格网高;
格网的行列号与格点数组索引序号存在如下计算关系:
index = grid_row*格网宽+grid_column;
一个格网平面是由很多格点单元(小正方形)组成的,这种小单元拥有地理位置属性,即输入任意经纬度,都能通过元数据,计算出其对应格网行列号,再通过上一个公式获取格点值,具体计算关系如下:
grid_row = floor((lat-Start.y)/res_y);
grid_column = floor((lon-Start_x)/res_x);
存储设计
一个格点文件,通常包括很多个不同时间不同高度的格网,而一个格网,是由元数据+格点数组组成的。采用连续数组是一种空间连续数据的一种压缩形式,避免反复描述数据位置时间等增大文件体积,所以在设计上我们仍将保留这种格点文件设计形式。
存储设计上将一份格网设计成三张表:数据集表(dataset),格网表(grid),数据表(data),设想一个格点文件是一个数据集,数据集表主要描述