ArcGIS紧凑型缓存存储格式分析

by 蔡建良 2018-8-24 

网络中我看到的网文将bundle存储切片数据的方式都没说清或是说错。按照错误方法一样可以在桌面浏览,但在arcgis for android却无法浏览。

bundlx存储格式的分析:
1) 每个bundlx文件的大小都是81952 字节(我这里PacketSize是128),前面16字节 + 每个图片偏移量5字节 * (128 * 128)个切片 + 结尾16字节。
2) 每个bundle文件中最多存储16384个切片。
3) 文件起始16字节和文件结束16字节与索引无关。
起始16字节: { 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00 }

结束16字节: { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }

4) 剩余的81920字节数据以5个字节的频率重复,构成了一个对bundle文件的索引。
5) 5个字节是以低位到高位的方式标示了数据的偏移量(在bundle文件中的地址)。
6) bundlx中的每5个字节标示的到底是哪个切片的数据偏移?
按列-行存储:先是1列1行、1列2行……2列1行、22……这样写的位置。

bundle存储格式的分析:
1) 从0x00到0x3b的这些位置都是bundle文件的描述信息。
0-7:      固定
8-b:      所有瓦片当中文件大小最大的一张切片的文件大小的数值
c-f:       固定
10-13:  表示非空文件个数*4
14-17:  固定
18-1b:  bundle文件大小
1c-1f:   固定
20-2b:  固定
2c-2f:   开始行
30-33:  结束行
34-37:  开始列
38-3b:  结束列

2) bundle文件里从0x3c->0x1003c这些位置是为空切片预留了偏移位置。
3) bundle中的切片数据是如何存储?
按行-列存储:先是1行1列、1行2列……2行1行、2行2列……这样写的位置。(这个与bundlx相反)
依次按照行列顺序开始写切片,如果遇到空的,就指向0x3c->0x1003c的空位置段,
比如第r行第c列切片是空的,对应的位置就是 0x3c + ((c - colStart) * this.m_packetSize + (r - rowStart)) * 4。
4) 非空切片在bundle文件里是从0x1003c开始写的。
5) 找到非空切片存储的偏移位置,接下来的4个字节是该image的长度,
然后在这4个字节之后取这些长度的字节就组合成了一副图像。

 

按照以上存储格式采用C#编码开发工具,紧凑型和松散型切片可以互转了,经测试在平板桌面都没问题 。

 

 

posted on 2018-08-24 18:44  janehlp  阅读(1189)  评论(1编辑  收藏  举报