主权项 |
一种基于影像块组织的遥感数据云存储方法,其特征在于包括如下步骤:(1)影像数据的入库1)初始化连接HDFS集群,设置分布式文件系统数据块副本数,创建索引序列容器和数据序列容器,分别用于存储影像数据块索引记录和影像数据块实体记录,指定索引文件的基本偏移量,即数据序列容器的初始字节数,以及索引记录偏移量,即每个索引记录所占的字节数;2)写入分布式影像数据集的元数据将元数据以二进制流形式写入数据序列容器作为首记录;在元数据实体写入之前,预先写入元数据二进制流的长度,以便后续程序根据元数据实际长度正确读取;在元数据实体写入之后,写入其CSC32检验码,用于快速检验数据的完整性;3)对影像数据块进行编码根据下式对待入库的影像数据块进行编码,产生对应于各层、各子层或各波段、各行列位置的影像数据块的M码;M=((long)layer)<<56|((long)band)<<48|((long)hCode) (1)其中,layer为层级,band为波段号,hCode为影像数据块的位置的Hilbert编码。4)循环写入索引数据和影像数据块分别将索引数据键值对<M<sub>k</sub>,P<sub>k</sub>>和影像数据块键值对<M<sub>k</sub>,(T<sub>k</sub>,C<sub>k</sub>)>写入索引序列容器和数据序列容器,其中M、P、T、C分别表示影像数据块的M码、序列容器中的存储位置、影像数据块二进制流和CSC32校验码;首先在索引序列容器中写入当前数据序列容器的长度,再将<M<sub>k</sub>,(T<sub>k</sub>,C<sub>k</sub>)>键值对写入数据序列容器,从而记录影像数据块键值对<M<sub>k</sub>,(T<sub>k</sub>,C<sub>k</sub>)>实际存储位置P<sub>k</sub>值;在写入目标影像数据块二进制流之前,须先写入目标影像数据块本身的数据长度,供后续程序的正确读取。5)完成写入完成所有影像数据块写入后,关闭索引序列容器和数据序列容器,并释放所有其他系统I/O资源;(2)影像数据的检索影像数据检索是根据用户所请求的空间范围,从分云平台上读取特定分辨率层级、特定范围内的影像数据块集合,主要步骤如下:1)读取元数据连接HDFS集群,根据索引序列容器和存储序列容器的URI打开索引序列容器和数据序列容器,从数据序列容器中读取元数据记录值,并通过CSC32校验码验证元数据的完整性;2)计算影像数据块行列号解析元数据记录二进制流,从中读取指定层级的坐标范围和影像数据块行列数,由此计算出所需的各影像数据块的行列号;3)计算影像数据块M码根据Hilbert编码的计算规则,将目标影像数据块行列号换算成影像数据块Hilbert码,并根据(1)式计算出M码,将各影像数据块的M码按递增次序进行排序,形成影像数据块的M码的有序集合;4)计算目标影像数据块的索引记录位置根据下式计算目标影像数据块的索引记录<M<sub>k</sub>,P<sub>k</sub>>位置indexPos,从而准确获取目标影像数据块的索引记录键值对<M<sub>k</sub>,P<sub>k</sub>>;<maths num="0001"><math><![CDATA[<mrow><mi>indexPos</mi><mo>=</mo><mi>base</mi><mo>+</mo><mrow><mo>(</mo><munderover><mi>Σ</mi><mrow><mi>i</mi><mo>=</mo><mn>0</mn></mrow><mrow><mi>k</mi><mo>-</mo><mn>1</mn></mrow></munderover><mrow><mo>(</mo><msub><mi>rowCount</mi><mi>i</mi></msub><mo>×</mo><msub><mi>colCount</mi><mi>i</mi></msub><mo>)</mo></mrow><mo>+</mo><mi>hCode</mi><mo>)</mo></mrow><mo>×</mo><mi>offset</mi><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>2</mn><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000386981650000021.GIF" wi="1732" he="158" /></maths>其中,hCode为目标影像数据块在所在层中的Hilbert编码,rowCount<sub>i</sub>和colCount<sub>i</sub>分别为第i层影像数据块行列数,base为索引文件的基本偏移量,offset为每个索引记录键值对的标准偏移量;5)读取目标影像数据块集合通过P<sub>k</sub>从数据序列容器中准确读取数据块键值对<M<sub>k</sub>,(T<sub>k</sub>,C<sub>k</sub>)>,实现目标影像数据块二进制流T<sub>k</sub>的读取,并通过其CSC32校验码C<sub>k</sub>来校验数据读取和传输过程T<sub>k</sub>的正确性。 |