arcgis server 紧促(bundle)格式缓存文件的读取

本文详细解析了ArcGIS Server中的Bundle缓存格式,包括.bundle与.bundlx文件的存储方式及读取方法。通过具体示例介绍了如何通过C#代码实现本地读取并解析这些文件。

一:自10.0出来后,增加了另外一种缓存文件格式bundle,紧促型。比起以往的松散型格式。

         对两种不同的存储格式,最大的区别在于紧蹙格式保存的切片小文件少,一个bundle可以保存128张切片,易于缓存的迁移,节约空间等。

二:server bundle格式图片的读取

         网上已经有大神放出了bundle的存储格式,esri官方资料说的是不提供其读取方法,想要脱离server自己写的只有动手咯。

         具体格式解析:http://blog.youkuaiyun.com/warrenwyf/article/details/6069711

         Bundle存储有两个文件

         .bundle存储图片数据

         .bundlx存储图片在dundle文件中的偏移量

 

        

 

                   每个bundlx文件都一样大81920+32字节,前后16个描述信息,剩下的是可用信息,并且以每5个字节重复,存储了对应的图片在bundle文件中的偏移量。并且bundlx文件存储图片偏移量信息的顺序是按列存储。

              Bundle文件就相对简单了,4个字节图片存储长度+真是在图片信息;如此循环;

              具体的参看上面链接。

1.    Bundle文件的命名格式

因为在一个层级下面,如果图很大,而一个bundle只能存128*128个,所以可能会有多个bundle文件存在,这样就需要对其按所在区域分类命名。

         “R0080C0180” 以R+4位16进制数字+C+4位16进制数字组成。对于4个16进制计算规则。128*(row/128),然后转换成16进制即可。举例:1-128行的是R0000,129-256的是R0080。列的计算同理。

 

贴上读取一个贴片代码:C#本地读取代码

       public byte[] getTile(int level, int row, int col)

        {

            int size = 128;

            byte[] result = null;

            FileStream isBundle = null;

            FileStream isBundlx = null;

            try

            {

                string bundlesDir ="F:\\data\\test1\\Layers\\_alllayers";

                string l = "0" +level;

                int lLength = l.Length;

                if (lLength > 2)

                {

                    l = l.Substring(lLength -2);

                }

                l = "L" + l;

 

                int rGroup = size * (row /size);

                string r = "000" +rGroup.ToString("X");

                int rLength = r.Length;

                if (rLength > 4)

                {

                    r = r.Substring(rLength -4);

                }

                r = "R" + r;

 

                int cGroup = size * (col /size);

                string c = "000" +cGroup.ToString("X");

                int cLength = c.Length;

                if (cLength > 4)

                {

                    c = c.Substring(cLength -4);

                }

                c = "C" + c;

 

                string bundleBase = bundlesDir+ "//" + l + "//" + r + c;

                string bundlxFileName =bundleBase + ".bundlx";

                string bundleFileName =bundleBase + ".bundle";

 

                int index = size * (col -cGroup) + (row - rGroup);

                             //行列号是整个范围内的,在某个文件中需要先减去前面文件所占有的行列号(都是128的整数)这样就得到在文件中的真是行列号

                isBundlx = newFileStream(bundlxFileName, FileMode.Open, FileAccess.Read);

                isBundlx.Seek(16 + 5 * index,SeekOrigin.Begin);

                byte[] buffer = new byte[5];

                isBundlx.Read(buffer, 0, 5);

                long offset = (long)(buffer[0]& 0xff) + (long)(buffer[1] & 0xff)

                        * 256 + (long)(buffer[2]& 0xff) * 65536

                       + (long)(buffer[3] &0xff) * 16777216

                        + (long)(buffer[4]& 0xff) * 4294967296L;

 

                isBundle = newFileStream(bundleFileName, FileMode.Open, FileAccess.Read);

                isBundle.Seek(offset,SeekOrigin.Begin);

                byte[] lengthBytes = newbyte[4];

                isBundle.Read(lengthBytes, 0,4);

                int length =(int)(lengthBytes[0] & 0xff)

                        + (int)(lengthBytes[1] & 0xff) * 256

                        + (int)(lengthBytes[2]& 0xff) * 65536

                        + (int)(lengthBytes[3]& 0xff) * 16777216;

                result = new byte[length];

                isBundle.Read(result, 0,length);

            }

            catch (Exception ex)

            {

                return null;

            }

            finally

            {

                if (isBundle != null)

                {

                    isBundle.Close();

                    isBundlx.Close();

                }

            }

            return result;

        }

 

返回结果是一个byte数组,流里面包含了生成一个图片的全部信息,直接放入内存流里面,可以直接得到图片。



### 使用Java读取ArcGIS Server 10.3 Bundle格式切片缓存文件 ArcGIS Server 10.3 引入了新型紧凑型缓存格式(Compact Cache Format 2.0),其中 `.bundle` 文件是其主要组成部分。这种格式相较于早期版本的 `.bundlx` 和 `.bundle` 更加高效,但同时也增加了读取和解析的复杂性。使用 Java 开发读取 `.bundle` 文件需要理解其内部结构并实现相应的解析逻辑。 #### .bundle 文件结构概述 `.bundle` 文件实际上是一个二进制文件,包含多个瓦片(tiles)的数据。每个瓦片通常以 PNG 或 JPEG 格式存储,并通过特定的索引机制定位。在 ArcGIS Server 中,`.bundle` 文件与 `.bundlx` 文件配对使用,后者提供索引信息以快速定位瓦片。然而,从 10.3 版本开始,`.bundlx` 文件被移除,取而代之的是基于文件名的索引机制[^1]。 #### Java 实现步骤 以下是使用 Java 读取 `.bundle` 文件的主要方法: 1. **解析文件名** `.bundle` 文件名遵循特定的命名规则,例如 `L01R0000.bundle`,其中 `L01` 表示级别(Level),`R0000` 表示行号(Row)。列号(Column)则通过文件内容中的偏移量计算得出。 2. **读取二进制数据** 使用 Java 的 `FileInputStream` 或 `RandomAccessFile` 类读取 `.bundle` 文件的内容。每个 `.bundle` 文件包含多个瓦片,瓦片的大小和位置由文件头信息定义。 3. **解析瓦片数据** 瓦片数据通常以 PNG 或 JPEG 格式存储。可以通过 Java 的图像处理库(如 `javax.imageio.ImageIO`)加载这些瓦片。 4. **代码示例** 以下是一个简单的 Java 示例,展示如何读取 `.bundle` 文件并提取瓦片数据: ```java import java.io.*; import javax.imageio.ImageIO; public class BundleReader { public static void main(String[] args) { try { // 指定 .bundle 文件路径 File bundleFile = new File("path/to/L01R0000.bundle"); // 打开文件流 RandomAccessFile raf = new RandomAccessFile(bundleFile, "r"); byte[] header = new byte[8]; // 假设文件头为 8 字节 raf.read(header); // 解析文件头信息 int tileSize = parseTileSize(header); // 假设前 4 字节表示瓦片大小 int tileCount = parseTileCount(header); // 假设后 4 字节表示瓦片数量 // 遍历瓦片 for (int i = 0; i < tileCount; i++) { byte[] tileData = new byte[tileSize]; raf.read(tileData); // 将瓦片数据保存为图像文件 saveTileAsImage(tileData, "tile_" + i + ".png"); } raf.close(); } catch (IOException e) { e.printStackTrace(); } } private static int parseTileSize(byte[] header) { return ByteBuffer.wrap(header, 0, 4).order(ByteOrder.LITTLE_ENDIAN).getInt(); } private static int parseTileCount(byte[] header) { return ByteBuffer.wrap(header, 4, 4).order(ByteOrder.LITTLE_ENDIAN).getInt(); } private static void saveTileAsImage(byte[] tileData, String fileName) throws IOException { InputStream is = new ByteArrayInputStream(tileData); BufferedImage image = ImageIO.read(is); if (image != null) { ImageIO.write(image, "png", new File(fileName)); } } } ``` #### 注意事项 - 上述代码仅为示例,实际 `.bundle` 文件的结构可能更加复杂,需要根据具体版本进行调整。 - 瓦片的大小和数量可能因缓存配置而异,需结合实际文件头信息动态解析。 - 如果需要支持更复杂的缓存格式(如多分辨率或不同瓦片格式),建议参考 ArcGIS 官方文档或相关技术博客[^2]。 ---
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值