CN107977427B - 一种分类型栅格数据的存储及读取方法 - Google Patents
一种分类型栅格数据的存储及读取方法 Download PDFInfo
- Publication number
- CN107977427B CN107977427B CN201711215412.7A CN201711215412A CN107977427B CN 107977427 B CN107977427 B CN 107977427B CN 201711215412 A CN201711215412 A CN 201711215412A CN 107977427 B CN107977427 B CN 107977427B
- Authority
- CN
- China
- Prior art keywords
- pixel
- pixels
- file
- raster data
- value
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/901—Indexing; Data structures therefor; Storage structures
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/29—Geographical information databases
Abstract
本发明涉及一种分类型栅格数据的存储及读取方法,其存储方法为对由m类像素组成的K行L列的原始分类栅格数据Data进行存储,包括以下步骤,S1,根据像素的类型且以行为单位对所述原始分类栅格数据Data中的所有像素进行分类存储,并分别计算和存储每一类像素分类存储时所需的存储空间数值,生成与每一类像素对应的分类文件;S2比较每一类像素分类存储时所需的存储空间数值的大小,丢弃其中所需存储空间数值最大的一类像素所对应的分类文件;S3,记录所述原始分类栅格数据Data的元数据信息。本发明一种分类型栅格数据的存储方法可以大大减少存储空间,同时可以大量的减少栅格数据的网络传输率,提高系统的处理性能。
Description
技术领域
本发明涉及栅格数据处理领域,具体涉及一种分类型栅格数据的存储及读取方法。
背景技术
栅格数据模型将地理空间划分成若干行、若干列,称为一个像元阵列,其最小单元称为像元或像素,每个像素的位置由行列号确定,通过单元格中的值记录这一位置属于何种地理实体或记录某一主题要素在这个位置上的数值。具有整数型栅格单元值的栅格数据用来存储各种所谓的离散数据或分类数据,这种数据集描述了一种现象或存在于栅格单元所在位置的对象。例如,土地利用类型栅格数据,其每个像素存储的是一个整数,代表着该像素对应的地理空间的土地利用类别,如整数1代表耕地,整数2代表林地,整数3代表草地,等等。当然,也有栅格数据的每个像素存储的是连续型的数值,如DEM高程栅格数据,每个像素存储的是浮点数值,代表地面高度。另外,在栅格数据模型中,还有一个用来表征栅格像素值叫“无数据值”,这是一个特殊的整数值,来记录某些栅格像素的值,例如,对于上述的土地利用类型栅格数据,假设分类有耕地、草地、林地和建设用地等几大类,在生产该数据时,在某些区域人类无法进入观察土地利用情况或者卫星采集数据时被云层遮蔽等原因导致有些栅格像素无法确定其利用分类情况,一般情况下就用这个“无数据值”来记录;还有一种情况是,某些像素不具备某属性,因此也用“无数据值”来存储,例如对于位于海域的那些栅格像素,其没有所谓的土地利用概念,这个土地利用概念只是针对陆地才有意义,因此对于这些像素一般也用“无数据值”来存储。在实际应用中,这个“无数据值”是可以自行设定的,例如,可以用整数0来表示该“无数据值”,也可以用9999来表示,没有强制要求。
假设某分类型栅格数据是由K行L列个栅格单元组成,每个栅格单元存储的数据是一字节无符号整数型数值,例如上述土地利用类型栅格数据每个栅格单元存储的是土地利用分类情况整数值。按目前栅格数据模型的通常做法,每个栅格单元用1字节进行存储,则需要KxL个字节,当栅格的行列数KxL较大时所需要的存储空间非常大,这对系统的存储设备成本、网络传输效率都是很大的挑战。
发明内容
本发明所要解决的技术问题是提供一种分类型栅格数据的存储及读取方法,可以有效的减少数据存储量,节约存储设备成本、提高网络传输效率。
本发明解决上述技术问题的技术方案如下:一种分类型栅格数据的存储方法,对由m类像素组成的K行L列的原始分类栅格数据Data进行存储,包括以下步骤,
S1,根据像素的类型且以行为单位对所述原始分类栅格数据Data中的所有像素进行分类存储,并分别计算和存储每一类像素分类存储时所需的存储空间数值,生成与每一类像素对应的分类文件;
S2,比较每一类像素分类存储时所需的存储空间数值的大小,丢弃其中所需存储空间数值最大的一类像素所对应的分类文件;
S3,记录所述原始分类栅格数据Data的元数据信息。
在上述技术方案的基础上,本发明还可以做如下改进。
进一步,m类像素中包括“无数据值”这一类型的像素,且2≤m≤8。
进一步,在S1中,设定对所述原始分类栅格数据Data中的第r行的第i类像素进行存储,具体包括以下步骤,
S11,在第r行中,从第1列到第L列依次读取每个像素的像素值V,
S12,依次判断每个像素的像素值V与第i类像素的像素值Vi是否相等,
S13,统计第r行中与第i类像素的像素值Vi相等的像素的个数X,并存储X的值;
S14,在存储的X值后,接着以列序号或标志位的形式对第r行中与第i类像素的像素值Vi相等的像素进行存储,生成第r行中第i类像素的数据存储结构D;
其中,1≤r≤K,1≤i≤m。
进一步,所述分类文件设有两个,分别为栅格数据文件dat和行存储空间记录文件meta;
将第1行至第K行中第i类像素的数据存储结构D按顺序进行存储生成第i类像素对应的所述栅格数据文件dat;
所述行存储空间记录文件meta中按顺序存储有第1行至第K行中的第i类像素所需的存储空间数值。
进一步,当X<[L/32]时,则以列序号的形式对第r行中与第i类像素的像素值Vi相等的像素进行存储;
以列序号的形式存储具体为,将第r行中与第i类像素的像素值Vi相等的像素的列序号按顺序进行存储;
当X≥[L/32]时,则以标志位的形式对第r行中与第i类像素的像素值Vi相等的像素进行存储;
以标记位的形式存储具体为,在第r行的L列个像素中,对每个像素设置一个bit的标志位来存储,以标志位1表示像素属于第i类,以标志位0表示像素不属于第i类;以第i类像素为基准,以字节为单位对第r行中的所有像素的标志位按顺序进行存储;若第r行的末尾不够,则以标志位0补齐。
进一步,在所述S3中,所述元数据信息包括所述原始分类栅格数据Data的行数K列数L、像素的分类总数m、每一个分类像素对应的名称和像素值Vi,以及除所需存储空间数值最大的一类像素外剩余分类像素对应栅格数据文件dat的名称和行存储空间记录文件meta的名称;
所需存储空间数值最大的一类像素对应栅格数据文件dat的名称和行存储空间记录文件meta的名称均设为null;
所述元数据信息存储在文件file.meta中。
进一步,每一类像素中存储的像素值为1字节的整数值,每个像素的列序号用4字节的无符号整数来存储,第r行中第i类像素所需的存储空间数值用4字节无符号整数来存储。
本发明的有益效果是:本发明一种分类型栅格数据的存储方法充分考虑到分类型栅格数据的分类个数不多时,假如某个分类占比很大,其余分类占比较小的情况下,利用存储分类比重较小的,通过排除法可知余下的像素就是占比最大的分类的这一特点,可以大大减少存储空间,同时可以大量的减少栅格数据的网络传输率,提高系统的处理性能。
基于上述一种分类型栅格数据的存储方法,本发明还提供一种分类型栅格数据的读取方法。
一种分类型栅格数据的读取方法,按行读取利用上述所述的一种分类型栅格数据的存储方法所存储的原始分类栅格数据Data,设定需要读取所述原始分类栅格数据Data的第r行,包括以下步骤,
步骤一,为所述原始分类栅格数据Data的第r行的像素分配存储空间L个字节,并初始化设置L个字节的数值为Vx,其中Vx为所需存储空间数值最大的一类像素所对应的像素值;
步骤二,在文件file.meta中读取所述原始分类栅格数据Data的元数据信息;
步骤三,根据所述元数据信息分别读取每一个分类像素所对应的栅格数据文件dat和行存储空间记录文件meta;
步骤四,解析每一个分类像素所对应的栅格数据文件dat和行存储空间记录文件meta,得出所述原始分类栅格数据Data的第r行中各像素的类别和像素值Vi;
步骤五,根据步骤四中所述原始分类栅格数据Data的第r行中各像素的类别,将步骤一中L个字节中属于对应分类的像素的数值Vx设置成对应的像素值Vi。
在上述技术方案的基础上,本发明还可以做如下改进。
进一步,设定对第i类像素所对应的栅格数据文件dat和行存储空间记录文件meta进行解析,且将第i类像素所对应的栅格数据文件dat和行存储空间记录文件meta的文件名称分别设定为Vi.dat和Vi.meta,则步骤四具体为,
读出Vi.meta文件,从Vi.meta文件的头开始按顺序读出r-1个4字节无符号整数值q[r-1],将这r-1个q[r-1]的数值进行累加,得到数值z;
从Vi.meta文件头开始按顺序读出第r个4字节无符号整数值w,则w的数值就是原始分类栅格数据Data的第r行中的像素在Vi.dat文件中需要的存储空间数值;
通过数值z和w定位出原始分类栅格数据Data的第r行的像素在V1.dat文件中存储空间的位置,即从V1.dat文件的第z+1个字节开始,共占用存储空间w字节;
在Vi.dat文件中,从第z+1个字节开始读出第1个4字节无符号整数值s,则s的数值就是原始分类栅格数据Data的第r行中的L列像素中属于第i类像素的的个数;
判断s与[L/32]的大小,
若s<[L/32],并且设定w=4*a,则对V1.dat文件从第z+1个字节开始以4字节为单位读取,得到a个4字节无符号整数值数组p;如果a=1,则说明本行中没有分类i像素;如果a>1,则p[c]表示第r行中的第c个属于第i像素的列序号,且将步骤一中分配的L个字节的存储空间中的第p[c]个字节的数值Vx设置为Vi,其中c=1,2,3......,a-1;
若s≥[L/32],则以字节为单位,在Vi.dat文件中从第z+5个字节开始读取共w-4个1字节无符号整数数组b[w-4];以二进制表示w-4个字节,则共有(w-4)*8位,且(w-4)*8位分别对应原始分类栅格数据Data的第r行的L列像素;依次判断(w-4)*8位中的标记位,将标记位为1所对应的步骤一中分配的L个字节的存储空间的像素值Vx设置为Vi。
具体实施方式
以对本发明的原理和特征进行描述,所举实例只用于解释本发明,并非用于限定本发明的范围。
总体思路:假设某原始分类栅格数据Data记录的属性分类共有m类像素,本具体实施例要求2≤m≤8,且包括“无数据值”这个特殊的分类。首先,根据像素的分类,将原始分类栅格数据Data中的所有像素进行分类单独存储;然后,比较各分类像素的存储空间大小,得到一个需要最大存储空间的分类像素,将需要最大存储空间的分类像素的数据不存储,只保留且存储余下的m-1类分类像素的数据;最后,对于原始分类栅格数据Data,需要记录元数据信息,例如,要记录栅格数据的总行数,总列数,各分类的名称,各分类用什么整数值来表示,无数据值用的整数值以及不存储的分类型是哪类等等。其中,对于各分类的存储,本文提出的方法也是能很大程度减少存储空间的。
简单的类比,假设某原始分类栅格数据Data有10行10列共100个像素,其中,每个像素的数值是0(无数据值),1,2,3,4,5中的某一个,首先,我们对于这6类分别进行存储,假设存储在6个文件里,然后发现,像素值为3的这一类型的像素的存储空间需要最多,其存储的文件最大,那么我们丢弃它,只保留了其余的5个文件,因为通过这5个分类存储的信息,我们就能知道100个像素中余下的像素数值必定是3(通过排除法可知)。而且,我们存储的5个分类的5个文件,所用空间都很少,因此在整体上比普通栅格数据模型很大程度上减少了存储空间。
具体步骤:
假设某原始分类栅格数据Data由K行L列组成,每个栅格的像素的数据需要1字节的存储空间,假设共有分类m类,每一类像素中存储的整数值分别为V1,V2,..,Vm。
第一步:对原始分类栅格数据Data按各分类像素分别进行单独存储,存储时按行进行处理,同时需要记录每行的栅格数据存储时所需存储空间数值。
具体的:对于第1类像素V1(假设为“无数据值”分类),在原始分类栅格数据Data中,
从第1行开始,共有L列个像素,按顺序,从第1列开始读取每个像素值V,若V=V1,则该像素为第1类像素V1,否则,不属于第1类像素V1,统计出第1行中共有多少个第1类像素V1(“无数据值”像素),假设有X个第1类像素V1。
如果X<【L/32】,则直接存储属于第1类像素V1的像素的每个列序号(本文所述的行列序号均指从1开始)。如果X≥【L/32】,则对于L列个像素,每个像素设置一个标志位(1bit位空间大小)来存储,以标志位1表示该像素属于第1类像素V1,以标志位0表示该像素不属于第1类像素V1;总存储空间以1字节为单位,末尾不够则以标志0补齐。
存储时,先存储属于第1类像素V1的总像素数量X,再存储各像素数据(列序号或标志位)。
例如,L列个像素为1002个,其像素的数值表1所示:
表1
V1 | V2 | V2 | V1 | V3 | V1 | V4 | V2 | ... | V1 | Vm |
如果在该L=1002个像素中,属于第1类像素V1的像素数量X=18<[L/32]=31,说明该行中属于第1类像素V1的像素较少,那么我们就可以直接存储属于第1类像素V1的每个像素的列序号,每个列序号用4字节的无符号整数来存储(假设L<2的32次方,通常的数据都符合该条件),那么存储时,存储结构如表2所示:
表2
其中,共需要存储空间:4+18*4(字节)=76字节。
如果在该L=1002个像素中,属于第1类像素V1的像素数量X=450≥[L/32]=31,则说明该行中属于第1类像素V1的像素较多,那么我们就可以直接存储原始分类栅格数据Data中每个像素的标志,以标志位1表示该像素属于第1类像素V1,以标志位0表示该像素不属于第1类像素V1,对表1中的数值,前8个像素的标志位结构如表3所示:
表3
1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | ... |
那么在存储时,首先存储总像素数量X,然后是前8个像素的标志位共1个字节,存储结构如表4所示:
表4
450(4字节的空间) | 148(1字节,二进制10010100) | ... |
对L=1002个像素,以8位标志即1字节为单位,按顺序存储,假设最后还剩下2个像素值,如表5所示:
表5
V1 | Vm |
这时候以标志位0补足8位,得到最后一个字节的标志位结构如表6所示:
表6
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
那么,该行L=1002个像素的存储结构如表7所示:
其中,共需要存储空间:4+[1002/8]+1(字节)=130字节。
对于第2行中的第1类像素V1,其处理方法与第1行中的第1类像素V1的处理方法完全相同,假设共需要存储空间:4+8*4(字节)=36字节。
对于第3行中第1类像素V1,其处理方法与第1行中的第1类像素V1的处理方法完全相同,假设共需要存储空间:4+[1002/8]+1(字节)=130字节。
...
对于第K行中的第1类像素V1,其处理方法与第1行中的第1类像素V1的处理方法完全相同,假设共需要存储空间:4+12*4(字节)=52字节。
我们存储第1类像素V1的栅格数据时,采用2个分类文件:栅格数据文件dat和行存储空间记录文件meta,其中栅格数据文件dat的存储结构是顺序存储上述K行的存储结构(表2或表4或表7),例如表8所示:
表8
其中,行存储空间记录文件meta中需要存储每行数据的存储空间数值,这样在上述栅格数据文件dat中就可以方便的定位任意一行原始分类栅格数据Data存储在栅格数据文件dat里的起始字节位置。例如,对原始分类栅格数据Data的第3行的L列个像素数据,在上述的栅格数据文件dat中定位对应的存储空间,假如我们知道在上述的栅格数据文件dat中存储的原始分类栅格数据Data的第一行、第二行我们分别用了多大存储空间,那么我们就可以很快的定位到原始分类栅格数据Data的第3行像素数据在栅格数据文件dat的起始存储位置。基于这个思路,我们在行存储空间记录文件meta中,对原始分类栅格数据Data的每行(共有K行)使用4字节无符号整数来记录存储在栅格数据文件dat里需要的存储空间数值,经过计算得知4字节无符号整数最大可记录的存储空间是4GB(对目前的原始分类栅格数据Data来说一行像素存储空间远小于4GB,是足够用的)。总共需要4*K字节存储空间。行存储空间记录文件meta的存储结构如表9所示:
表9
130 | 36 | 130 | ... | ... | ... | ... | 52 |
对于第2类像素V2,在原始分类栅格数据Data中,
从第1行开始,共有L列个像素,按顺序,从第1列开始读取每个像素值V,若V=V2,则该像素为本分类,否则,不属于本分类,统计出本行中共有多少个属于“第2类像素V2”的像素,余下的处理步骤完全同上述第1类像素V1的处理步骤。同样,我们得到该分类的2个存储文件:栅格数据文件dat和行存储空间记录文件meta,其中,行存储空间记录文件meta也是总共需要4*K字节存储空间。
对于第2至m类像素Vi,同样处理,分别得到2个存储文件:栅格数据文件dat和行存储空间记录文件meta,其中,行存储空间记录文件meta总共需要4*K字节存储空间。
第二步:比较各分类像素所需存储空间数值的大小,丢弃其中需要最大存储空间的一类像素的分类文件。
假设在第一步中得到的分类存储空间,第1类像素V1的栅格数据文件dat所需空间最大,则不存储第1类像素V1的数据,即第1类像素V1所对应的栅格数据文件dat和行存储空间记录文件meta都不需要存储。
第三步:记录原始分类栅格数据Data的元数据信息。
所述元数据信息的结构包括:所述原始分类栅格数据Data的行数K列数L、像素的分类总数m、每一个分类像素对应的名称和像素值Vi,以及除所需存储空间数值最大的一类像素外剩余分类像素对应栅格数据文件dat的名称和行存储空间记录文件meta的名称;所需存储空间数值最大的一类像素对应栅格数据文件dat的名称和行存储空间记录文件meta的名称可以设为null。对于元数据信息的存储可以写到一文本文件中,如file.meta(元数据信息文件),内容可参考如下(存储方式灵活不限,即可以是文本方式,也可以是二进制的文件格式):
假设某原始分类栅格数据Data共有K=120000行,L=160000列,像素的分类共有4类,第1类像素(“无数据值”)用1字节整数值V1=0表示,第2类像素用1字节整数值V2=20表示,第3类像素用1字节整数值V3=30表示,第4类像素用1字节整数值V4=40表示,按上述方法,对该原始分类栅格数据Data中4个类型的像素分别进行单独存储,得到各分类的分类文件如下:
第1类像素,栅格数据文件V1.dat,共需要存储空间约76MB,行存储空间记录文件V1.meta共需要存储空间约468KB。
第2类像素,栅格数据文件V2.dat,共需要存储空间约1373MB,行存储空间记录文件V2.meta共需要存储空间约468KB。
第3类像素,栅格数据文件V3.dat,共需要存储空间约686MB,行存储空间记录文件V3.meta共需要存储空间约468KB。
第4类像素,栅格数据文件V4.dat,共需要存储空间约228MB,行存储空间记录文件V4.meta共需要存储空间约468KB。
由于第2类像素的数据所需的存储空间最大,那么,最终存储时,只保留第1类像素的栅格数据文件V1.dat和行存储空间记录文件V1.meta、第3类像素的栅格数据文件V3.dat和行存储空间记录文件V3.meta、第4类像素的栅格数据文件V4.dat和行存储空间记录文件V4.meta,以及元数据信息文件file.meta.其中file.meta的存储数据内容为:
应用本发明的存储方法时,该原始分类栅格数据Data的总存储大小约为(76+686+228)MB=990MB,行存储空间记录文件meta与元数据信息文件file.meta可以忽略不计。按通常的栅格数据结构,则需要KXL=120000x160000字节,约为17.88GB.由此可见,本方法很大程度上减少了存储空间。之所以能大大减少存储空间,下面进行分析。
假设某原始分类栅格数据Data有K行L列,其像素有4个分类。
采用本方法存储时,
对于第1类像素:对第1行的L列个像素,属于该分类的像素有X个像素,
假如X<[L/32],则该行需要X*4字节,最大不会超过[L/32]*4=[L/8]字节。
假如X≥[L/32],则该行固定需要[L/8]字节(最后一个字节不足8位时需要补补齐的几位0标记忽略不计)。
也就是说,记录该行的本分类像素的数据时,最多不会超过[L/8]字节。
同理,对第2行的L列个像素,...,对第K行的L列个像素,采用本方法时记录的每行分类栅格数据,最多不会超过[L/8]字节。
因此,本分类的栅格数据文件.dat的总大小不会超过原始分类栅格数据Data的1/8。
同理,对于第2类像素,应用本方法时本分类的栅格数据文件.dat的总大小不会超过原始分类栅格数据Data的1/8。
同理,对于第3类像素,应用本方法时本分类的栅格数据文件.dat的总大小不会超过原始分类栅格数据Data的1/8。
同理,对于第4类像素,应用本方法时本分类的栅格数据文件.dat的总大小不会超过原始分类栅格数据Data的1/8。
这时,基于整个原始分类栅格数据的像素只有4种分类,如果我们记录了其中的三类,则余下的栅格的像素肯定就是未保存的那个分类(使用排除法就可得知)。所以,应用本方法需要存储的空间不会超过原始分类栅格数据Data的1/8*3,并且我们丢弃的某个分类的栅格数据文件dat还是4个分类中占存储空间最大的那个(该分类占原始分类型栅格数据像素越高,应用本方法时需要的存储空间也就越大,那么本方法不需要存储的数据量就越高),因此,实际上需要的存储空间远小于原始栅格数据的3/8。当然,分类型栅格数据的分类个数越多,应用本方法需要存储各个分类的数据就越多,例如,当分类个数m=8(包括无数据值分类)时,共需要存储7个分类的栅格数据文件dat,应用本方法需要存储的空间在理论上是不会超过原始栅格数据的7/8,考虑未存储的分类所占的存储空间最大的情况,实际上需要的存储空间要远小于原始分类栅格数据Data的7/8。像素的分类个数越少,本方法能节省的存储空间越大,因此,本发明开始就约定,像素的总的分类数m≤8。在实际应用中,对于总分类m=4的情况下,往往能达到需要通常栅格数据存储空间(例如tif格式的栅格数据文件)的1/18或者更少的存储空间。
上面介绍了分类型栅格数据的存储方法,存储之后,在应用中需要读取,下面介绍读取栅格数据的方法,读取时按行为单位进行,一行一行的读取。
首先,读取分类型栅格数据的元数据信息,例如,通过读取元数据信息文件file.meta,得到该原始分类栅格数据Data的总行数K,总列数L,像素的分类总数m以及各分类像素在栅格像素中存储的1字节的无符号整数值V1,v1,v2,...,Vm,以及各分类像素对应的栅格数据文件dat名称和行存储空间记录文件meta名称,没有存储那一类分类像素,可通过元数据信息文件里的名称是否为null来判断,如下面元数据信息文件内容:
...
分类2名称=xxx;
分类2像素值=20;
分类2栅格数据文件dat名称=null;
分类2行存储空间记录文件meta名称=null;
...
我们可得到不需要存储的分类名称为xx,其像素值Vi=20。
假设要读出原始分类栅格数据的第一行数据
步骤一:分配存储空间L个字节,对应原始分类栅格数据的L个像素。初始化设置这L个字节的数值为Vx,即假设这行像素全是属于不需要存储的分类。
步骤二:对于m个分类,分别读取我们存储的各个分类栅格数据文件.dat和行存储空间记录文件.meta,解析得到第一行中哪些像素是分类1,哪些像素是分类2,等等,为这些分类的像素设置相应的整数值V1,V2等等。具体如下:
对于第一类像素,根据元数据信息,得到其对应的栅格数据文件dat名称,假设为V1.dat,和行存储空间记录文件meta名称,假设为V1.meta。
首先读V1.meta文件,读出其第1个4字节无符号整数值w,这个值就是第一行原始分类栅格数据Data存储时在V1.dat中需要的存储空间大小(字节为单位)。
然后对V1.dat文件,读出其第1个4字节无符号整数值s,这个值就是第一行原始分类栅格数据Data的L列像素中有多少个像素是属于第一类像素的。
假如s<[L/32],则说明V1.dat文件中第1个字节到第w个字节都是存储本行栅格数据的,并且w=4*a,对V1.dat文件的前w个字节以4字节为单位读取,得到a个4字节无符号整数值数组p,如果a=1,则说明本行中没有第1类像素的像素;如果a>1,p[1]表示本行的第一个属于第1类像素的像素列序号,将上面步骤一中分配的L个字节的存储空间的第p[1]个字节的数值Vx设置为V1;p[2]表示本行的第二个属于第1类像素的像素列序号,将上面步骤一中分配的L个字节的存储空间的第p[2]个字节的数值Vx设置为V1,...,p[a-1]表示本行的第a-1个属于第1类像素的像素列序号,将上面步骤一中分配的L个字节的存储空间的第p[a-1]个字节的数值Vx设置为V1。
假如s≥[L/32],则说明V1.dat中第5个字节到第w个字节都是存储本行栅格数据的标志位信息,以字节为单位,读取V1.dat文件中第5个字节到第w个字节得到1字节无符号整数数组b[w-4],共有w-4个字节,以二进制表示,共有(w-4)*8位,刚好对应原始分类栅格数据Data的L列像素是否属于本分类(后面几位补充标志位0的不在L列个像素范围内,不需要考虑):如果其标志位为1则表示属于本分类,否则不属于本分类;对上面步骤一中分配的L个字节,其对应的像素属于本分类的设置值Vx为V1。
对于第2、3、...m类像素,按上述相同方法,分别设置步骤一中分配的L个字节的相应像素分类值。
假设要读出原始分类栅格数据Data的第r(2<=r<=K)行数据
分配存储空间L个字节,对应原始分类栅格数据Data的第r行的L个像素。初始化设置这L个字节的数值为Vx,即假设这行数据全是属于不需要存储的分类。
对于m个分类,分别读取我们存储的各个分类像素所对应的栅格数据文件dat和行存储空间记录文件meta,解析得到第r行中哪些像素是第1类像素,哪些像素是第2类像素,...,为这些分类的像素设置相应的整数值V1,V2,...。具体如下:
对于分类1,根据元数据信息,得到其对应的栅格数据文件dat名称,假设为V1.dat,和行存储空间记录文件meta名称,假设为V1.meta.
首先读V1.meta文件,从文件头开始按顺序读出其r-1个4字节无符号整数值q[r-1],将这r-1个q[r-1]个数值进行累加,得到数值z;从V1.meta文件头开始按顺序读出其第r个4字节无符号整数值w,这个值就是第r行原始分类栅格数据Data使用本发明方法存储时在V1.dat文件中需要的存储空间数值(字节为单位)。
我们通过数值z就可以定位第r行原始分类栅格数据Data使用本文方法存储时在V1.dat文件中存储空间的位置:从V1.dat文件的第z+1个字节开始,共占用存储空间w字节。对V1.dat文件,从第z+1个字节开始读出其第1个4字节无符号整数值s,这个值就是第r行原始分类栅格数据Data的L列像素中有多少个像素是属于第1类像素。
假如s<[L/32],则说明V1.dat文件中第z+1个字节开始共w个字节都是存储本行栅格数据的,并且w=4*a,对V1.dat文件从第z+1个字节开始以4字节为单位读取,得到a个4字节无符号整数值数组p,如果a=1,则说明本行中没有分类1的像素;如果a>1,p[1]表示本行的第一个属于第1类像素的像素列序号,将上面分配的L个字节的存储空间的第p[1]个字节的数值Vx设置为V1,p[2]表示本行的第二个属于第1类像素的像素列序号,将上面分配的L个字节的存储空间的第p[2]个字节的数值Vx设置为V1,...,p[a-1]表示本行的第a-1个属于第1类像素的像素列序号,将上面分配的L个字节的存储空间的第p[a-1]个字节的数值Vx设置为V1,其中c=1、2、...a-1。
假如s≥[L/32],则说明V1.dat文件中从第z+5个字节开始共w-4个字节都是存储本行栅格数据的标志位信息,以字节为单位,读取V1.dat文件中第z+5个字节开始共w-4个1字节无符号整数数组b[w-4],共有w-4个字节,以二进制表示,共有(w-4)*8位,刚好对应原始分类栅格数据Data的L列像素是否属于本分类;对上面分配的L个字节的存储空间,如果其标志位为1则表示属于本分类,则将相应的像素值Vx设置为V1。
对于第2类像素,第3类像素,...,第m类像素,按上述相同方法,分别设置上面分配的L个字节的相应像素Vx的分类值。
至此,可以将原始分类栅格数据Data的各行数据重新读出来。
具体案例
以全国土壤侵蚀程度分类型栅格数据为例,共有分类数有4类,分别为“无数据值”、“轻度”、“中度”和“强度”,在30米分辨率情况下,通常存储方式下由行K=134724,列L=161360个栅格单元数据组成,采用1字节的无符号整数型数值存储,共需要的存储空间约为20.24GB(如Tif格式的数据文件)。应用本方法,经统计,无数据值分类,占原栅格像素的17%,栅格数据文件V1.dat共需要存储空间约562MB,行存储空间记录文件V1.meta共需要存储空间约468KB。
轻度分类,占原栅格像素的57%,栅格数据文件V2.dat,共需要存储空间约1982MB,行存储空间记录文件V2.meta共需要存储空间约526KB。
中度分类,占原栅格像素的20%,栅格数据文件V3.dat,共需要存储空间约786MB,行存储空间记录文件V3.meta共需要存储空间约526KB。
强度分类,占原栅格像素的6%,栅格数据文件V4.dat,共需要存储空间约197MB,行存储空间记录文件V4.meta共需要存储空间约526KB。
得到的栅格数值存储大小约为1.51GB,约为原始数据存储大小的7.45%,因此可以看出本方法极大的节省了存储空间。
本发明一种分类型栅格数据的存储及读取方法具有如下优点:
1.本发明的存储方法充分考虑到分类型栅格数据的分类个数不多时,假如某个分类占比很大,其余分类占比较小的情况下,利用存储分类比重较小的,余下的像素就是占比最大的分类的这一特点,提出的存储方法大大减少了存储空间。
2.利用本发明的存储方法,对于分类数量较少如<5类的海量分类型栅格数据的备份存储等非常适用,节约存储空间,降低系统成本。
3.基于本发明的存储及读取方法,可以大量的减少栅格数据的网络传输率,提高系统的处理性能。
4.另外,本发明的存储方法是针对栅格数据的存储结构层次进行处理的,与数据的压缩和编码并不冲突,利用本发明的存储方法得到的栅格数据文件dat和行存储空间记录文件meta,仍然可以使用各种数据压缩和编码技术进行再一步的处理,获得更小的存储空间。
5.对于具有分类数量较少的分类型栅格数据,如土壤侵蚀强度数据、电磁环境复杂度等,其各分类的像素占比往往很不均衡,某一类占比通常较大,例如达到整个栅格像素的60%,那么采用本方法往往可以得到低于原始栅格数据的10%的存储量的效果。
在本文件中,符号[p],表示不大于p的最大整数。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (8)
1.一种分类型栅格数据的存储方法,其特征在于:对由m类像素组成的K行L列的原始分类栅格数据Data进行存储,包括以下步骤,
S1,根据像素的类型且以行为单位对所述原始分类栅格数据Data中的所有像素进行分类存储,并分别计算和存储每一类像素分类存储时所需的存储空间数值,生成与每一类像素对应的分类文件;
S2,比较每一类像素分类存储时所需的存储空间数值的大小,丢弃其中所需存储空间数值最大的一类像素所对应的分类文件;
S3,记录所述原始分类栅格数据Data的元数据信息;
在S1中,设定对所述原始分类栅格数据Data中的第r行的第i类像素进行存储,具体包括以下步骤,
S11,在第r行中,从第1列到第L列依次读取每个像素的像素值V,
S12,依次判断每个像素的像素值V与第i类像素的像素值Vi是否相等,
S13,统计第r行中与第i类像素的像素值Vi相等的像素的个数X,并存储X的值;
S14,在存储的X值后,接着以列序号或标志位的形式对第r行中与第i类像素的像素值Vi相等的像素进行存储,生成第r行中第i类像素的数据存储结构D;
其中,1≤r≤K,1≤i≤m。
2.根据权利要求1所述的一种分类型栅格数据的存储方法,其特征在于:m类像素中包括“无数据值”这一类型的像素,且2≤m≤8。
3.根据权利要求2所述的一种分类型栅格数据的存储方法,其特征在于:所述分类文件设有两个,分别为栅格数据文件dat和行存储空间记录文件meta;
将第1行至第K行中第i类像素的数据存储结构D按顺序进行存储生成第i类像素对应的所述栅格数据文件dat;
所述行存储空间记录文件meta中按顺序存储有第1行至第K行中的第i类像素所需的存储空间数值。
4.根据权利要求3所述的一种分类型栅格数据的存储方法,其特征在于:
当X<[L/32]时,则以列序号的形式对第r行中与第i类像素的像素值Vi相等的像素进行存储;
以列序号的形式存储具体为,将第r行中与第i类像素的像素值Vi相等的像素的列序号按顺序进行存储;
当X≥[L/32]时,则以标志位的形式对第r行中与第i类像素的像素值Vi相等的像素进行存储;
以标记位的形式存储具体为,在第r行的L列个像素中,对每个像素设置一个bit的标志位来存储,以标志位1表示像素属于第i类,以标志位0表示像素不属于第i类;以第i类像素为基准,以字节为单位对第r行中的所有像素的标志位按顺序进行存储;若第r行的末尾不够,则以标志位0补齐。
5.根据权利要求4所述的一种分类型栅格数据的存储方法,其特征在于:在所述S3中,所述元数据信息包括所述原始分类栅格数据Data的行数K列数L、像素的分类总数m、每一个分类像素对应的名称和像素值Vi,以及除所需存储空间数值最大的一类像素外剩余分类像素对应栅格数据文件dat的名称和行存储空间记录文件meta的名称;
所需存储空间数值最大的一类像素对应栅格数据文件dat的名称和行存储空间记录文件meta的名称均设为null;
所述元数据信息存储在文件file.meta中。
6.根据权利要求5所述的一种分类型栅格数据的存储方法,其特征在于:每一类像素中存储的像素值为1字节的整数值,每个像素的列序号用4字节的无符号整数来存储,第r行中第i类像素所需的存储空间数值用4字节无符号整数来存储。
7.一种分类型栅格数据的读取方法,其特征在于:按行读取利用上述权利要求6中所述的一种分类型栅格数据的存储方法所存储的原始分类栅格数据Data,设定需要读取所述原始分类栅格数据Data的第r行,包括以下步骤,
步骤一,为所述原始分类栅格数据Data的第r行的像素分配存储空间L个字节,并初始化设置L个字节的数值为Vx,其中Vx为所需存储空间数值最大的一类像素所对应的像素值;
步骤二,在文件file.meta中读取所述原始分类栅格数据Data的元数据信息;
步骤三,根据所述元数据信息分别读取每一个分类像素所对应的栅格数据文件dat和行存储空间记录文件meta;
步骤四,解析每一个分类像素所对应的栅格数据文件dat和行存储空间记录文件meta,得出所述原始分类栅格数据Data的第r行中各像素的类别和像素值Vi;
步骤五,根据步骤四中所述原始分类栅格数据Data的第r行中各像素的类别,将步骤一中L个字节中属于对应分类的像素的数值Vx设置成对应的像素值Vi。
8.根据权利要求7所述的一种分类型栅格数据的读取方法,其特征在于:设定对第i类像素所对应的栅格数据文件dat和行存储空间记录文件meta进行解析,且将第i类像素所对应的栅格数据文件dat和行存储空间记录文件meta的文件名称分别设定为Vi.dat和Vi.meta,则步骤四具体为,
读出Vi.meta文件,从Vi.meta文件的头开始按顺序读出r-1个4字节无符号整数值q[r-1],将这r-1个q[r-1]的数值进行累加,得到数值z;
从Vi.meta文件头开始按顺序读出第r个4字节无符号整数值w,则w的数值就是原始分类栅格数据Data的第r行中的像素在Vi.dat文件中需要的存储空间数值;
通过数值z和w定位出原始分类栅格数据Data的第r行的像素在V1.dat文件中存储空间的位置,即从V1.dat文件的第z+1个字节开始,共占用存储空间w字节;
在Vi.dat文件中,从第z+1个字节开始读出第1个4字节无符号整数值s,则s的数值就是原始分类栅格数据Data的第r行中的L列像素中属于第i类像素的的个数;
判断s与[L/32]的大小,
若s<[L/32],并且设定w=4*a,则对V1.dat文件从第z+1个字节开始以4字节为单位读取,得到a个4字节无符号整数值数组p;如果a=1,则说明本行中没有分类i像素;如果a>1,则p[c]表示第r行中的第c个属于第i像素的列序号,且将步骤一中分配的L个字节的存储空间中的第p[c]个字节的数值Vx设置为Vi,其中c=1,2,3......,a-1;
若s≥[L/32],则以字节为单位,在Vi.dat文件中从第z+5个字节开始读取共w-4个1字节无符号整数数组b[w-4];以二进制表示w-4个字节,则共有(w-4)*8位,且(w-4)*8位分别对应原始分类栅格数据Data的第r行的L列像素;依次判断(w-4)*8位中的标记位,将标记位为1所对应的步骤一中分配的L个字节的存储空间的像素值Vx设置为Vi。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711215412.7A CN107977427B (zh) | 2017-11-28 | 2017-11-28 | 一种分类型栅格数据的存储及读取方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711215412.7A CN107977427B (zh) | 2017-11-28 | 2017-11-28 | 一种分类型栅格数据的存储及读取方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107977427A CN107977427A (zh) | 2018-05-01 |
CN107977427B true CN107977427B (zh) | 2021-08-24 |
Family
ID=62012158
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201711215412.7A Active CN107977427B (zh) | 2017-11-28 | 2017-11-28 | 一种分类型栅格数据的存储及读取方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107977427B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113589802A (zh) * | 2021-06-25 | 2021-11-02 | 北京旷视科技有限公司 | 栅格地图处理方法、装置、系统、电子设备和计算机介质 |
Citations (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102368272A (zh) * | 2011-11-15 | 2012-03-07 | 中国科学院地理科学与资源研究所 | 一种数据库系统实现栅格数据类型的方法及其系统 |
CN102521624A (zh) * | 2011-12-20 | 2012-06-27 | 中国科学院地理科学与资源研究所 | 一种土地利用类型分类的方法和系统 |
CN102867023A (zh) * | 2012-08-15 | 2013-01-09 | 北京地拓科技发展有限公司 | 一种栅格数据的存储、读取方法及装置 |
CN102915329A (zh) * | 2012-09-04 | 2013-02-06 | 北京地拓科技发展有限公司 | 栅格数据写入与读取的方法及装置 |
CN102929904A (zh) * | 2012-07-25 | 2013-02-13 | 北京世纪天宇科技发展有限公司 | 一种验证栅格数据的方法及系统 |
CN102968456A (zh) * | 2012-10-30 | 2013-03-13 | 北京地拓科技发展有限公司 | 一种栅格数据读取处理方法和装置 |
CN103246689A (zh) * | 2012-12-27 | 2013-08-14 | 北京地拓科技发展有限公司 | 一种栅格数据的预测方法和装置 |
CN103559375A (zh) * | 2013-11-22 | 2014-02-05 | 华中科技大学 | 调度工程水质改善的数值模拟及可视化仿真系统 |
CN103678682A (zh) * | 2013-12-26 | 2014-03-26 | 中国科学院遥感与数字地球研究所 | 基于抽象模板的海量栅格数据处理及管理方法 |
CN103871086A (zh) * | 2014-02-18 | 2014-06-18 | 中国林业科学研究院资源信息研究所 | 基于fpga构建的分层次栅格转矢量处理方法 |
CN103886045A (zh) * | 2014-03-12 | 2014-06-25 | 鲁东大学 | 一种包含局部有效栅格数据的存取方法及装置 |
CN104123305A (zh) * | 2013-04-28 | 2014-10-29 | 国际商业机器公司 | 地理数据处理方法及其系统 |
CN104123479A (zh) * | 2014-08-14 | 2014-10-29 | 国家电网公司 | 一种电网特殊区域数据栅格转矢量的质量控制方法 |
CN104268560A (zh) * | 2014-09-15 | 2015-01-07 | 复凌科技(上海)有限公司 | 一种基于遥感解译的土地利用识别方法 |
-
2017
- 2017-11-28 CN CN201711215412.7A patent/CN107977427B/zh active Active
Patent Citations (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102368272A (zh) * | 2011-11-15 | 2012-03-07 | 中国科学院地理科学与资源研究所 | 一种数据库系统实现栅格数据类型的方法及其系统 |
CN102521624A (zh) * | 2011-12-20 | 2012-06-27 | 中国科学院地理科学与资源研究所 | 一种土地利用类型分类的方法和系统 |
CN102929904A (zh) * | 2012-07-25 | 2013-02-13 | 北京世纪天宇科技发展有限公司 | 一种验证栅格数据的方法及系统 |
CN102867023A (zh) * | 2012-08-15 | 2013-01-09 | 北京地拓科技发展有限公司 | 一种栅格数据的存储、读取方法及装置 |
CN102915329A (zh) * | 2012-09-04 | 2013-02-06 | 北京地拓科技发展有限公司 | 栅格数据写入与读取的方法及装置 |
CN102968456A (zh) * | 2012-10-30 | 2013-03-13 | 北京地拓科技发展有限公司 | 一种栅格数据读取处理方法和装置 |
CN103246689A (zh) * | 2012-12-27 | 2013-08-14 | 北京地拓科技发展有限公司 | 一种栅格数据的预测方法和装置 |
CN104123305A (zh) * | 2013-04-28 | 2014-10-29 | 国际商业机器公司 | 地理数据处理方法及其系统 |
CN103559375A (zh) * | 2013-11-22 | 2014-02-05 | 华中科技大学 | 调度工程水质改善的数值模拟及可视化仿真系统 |
CN103678682A (zh) * | 2013-12-26 | 2014-03-26 | 中国科学院遥感与数字地球研究所 | 基于抽象模板的海量栅格数据处理及管理方法 |
CN103871086A (zh) * | 2014-02-18 | 2014-06-18 | 中国林业科学研究院资源信息研究所 | 基于fpga构建的分层次栅格转矢量处理方法 |
CN103886045A (zh) * | 2014-03-12 | 2014-06-25 | 鲁东大学 | 一种包含局部有效栅格数据的存取方法及装置 |
CN104123479A (zh) * | 2014-08-14 | 2014-10-29 | 国家电网公司 | 一种电网特殊区域数据栅格转矢量的质量控制方法 |
CN104268560A (zh) * | 2014-09-15 | 2015-01-07 | 复凌科技(上海)有限公司 | 一种基于遥感解译的土地利用识别方法 |
Non-Patent Citations (1)
Title |
---|
"连续性栅格数据的预测系统研究与应用";闫富松;《现代电子技术》;20171015;第40卷(第20期);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN107977427A (zh) | 2018-05-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Zwiener et al. | Climate change as a driver of biotic homogenization of woody plants in the Atlantic Forest | |
US9877031B2 (en) | System and method for multi-resolution raster data processing | |
CN111382867B (zh) | 神经网络压缩的方法、数据处理的方法及相关装置 | |
CN102411616A (zh) | 一种数据存储方法和系统及数据管理方法 | |
CN115834895A (zh) | 用于无人机的数据高效压缩存储方法 | |
CN112465114A (zh) | 基于优化通道剪枝的快速目标检测方法及系统 | |
CN107977427B (zh) | 一种分类型栅格数据的存储及读取方法 | |
CN103678657B (zh) | 一种地形高程数据存储和读取的方法 | |
CN112036454B (zh) | 一种基于多核密集连接网络的图像分类方法 | |
CN111405294B (zh) | 一种图像栅格数据的存储及传输方法 | |
CN113806601B (zh) | 一种周边兴趣点检索方法及存储介质 | |
CN106453611A (zh) | 一种多存储节点负载均衡的方法及装置 | |
CN113360911A (zh) | 恶意代码同源分析方法、装置、计算机设备和存储介质 | |
CN102867023A (zh) | 一种栅格数据的存储、读取方法及装置 | |
CN103886045B (zh) | 一种包含局部有效栅格数据的存取方法及装置 | |
CN116009779A (zh) | 一种多维数据的存储方法 | |
CN104715070A (zh) | 一种大图像文件及生成和读取方法 | |
CN108595508B (zh) | 一种基于后缀数组的自适应索引构建方法及系统 | |
CN107992555B (zh) | 一种栅格数据的存储及读取方法 | |
CN112817982A (zh) | 一种基于lsm树的动态幂律图存储方法 | |
CN102567945A (zh) | 页面数字图像的光栅化处理方法和装置 | |
CN115543944A (zh) | 一种分类型栅格数据无损压缩存储与读取方法 | |
US20240005445A1 (en) | System and method for high-throughput image processing | |
Hossain et al. | A lossless image compression technique using generic peano pattern mask tree | |
CN113721839B (zh) | 用于处理图数据的计算系统和存储分层方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |