/// <summary>
        /// 传入坐标获取切片
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <param name="z"></param>
        public void  GetTile(int x, int y, int z)
        {
            var packSize = this.packSize;
            var format   = this.storageFormat;
            var rGroup   = Convert.ToInt32(packSize * Convert.ToInt32(y / packSize));
            var cGroup   = Convert.ToInt32(packSize * Convert.ToInt32(x / packSize));

            var bundleBase     = getBundlePath(this.rootPath, z, rGroup, cGroup);
            var bundleFileName = bundleBase + ".bundle";
            var context        = new bundlx()
            {
                bundleFileName = bundleFileName,
                storageFormat  = format
            };

            if (format == formatV1)
            {
                context.bundlxFileName = bundleBase + ".bundlx";
                context.index          = packSize * (x - cGroup) + (y - rGroup);
            }
            else if (format == formatV2)
            {
                context.index = packSize * (y - rGroup) + (x - cGroup);
            }
            else
            {
                throw new Exception("Unsupported format:" + format);
            }
            readTileFromBundle(context);
        }
        /// <summary>
        /// 读取切片对应字节
        /// </summary>
        /// <param name="bundleFileName"></param>
        /// <param name="offset"></param>
        /// <returns></returns>
        private byte[] readTile(bundlx context, int offset)
        {
            byte[] buffer     = new byte[4];
            byte[] bufferfile = TileCache.Instance[context].BundleData;
            //获取bundle具体切片文件字节数
            buffer = bufferfile.Skip(offset).Take(4).ToArray();
            var length = BitConverter.ToInt32(buffer, 0);

            byte[] tileData = new byte[length];
            //根据索引和字节数读出文件位置
            tileData = bufferfile.Skip(offset + 4).Take(length).ToArray();
            return(tileData);
        }
        private byte[] readTileFromBundleV2(bundlx context)
        {
            var bundlxFileName = context.bundlxFileName;
            var bundleFileName = context.bundleFileName;
            var index          = context.index;

            using (FileStream file = new FileStream(bundlxFileName, FileMode.Open))
            {
                byte[] buffer = new byte[4];
                file.Read(buffer, 64 + 8 * index, 4);
                var offset = BitConverter.ToInt32(buffer, 0) - 4;
                return(readTile(bundleFileName, offset));
            }
        }
        /// <summary>
        /// 读取切片
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        private byte[] readTileFromBundleV1(bundlx context)
        {
            var bundlxFileName = context.bundlxFileName;
            var bundleFileName = context.bundleFileName;
            var index          = context.index;

            byte[] buffer     = new byte [5];
            byte[] bufferfile = TileCache.Instance[context].BundlxData;
            // file.Read(bufferfile,0,(int)file.Length);
            //读取bundlx文件存储该切片的位置
            buffer = bufferfile.Skip(16 + 5 * index).Take(4).ToArray();
            //偏移量
            var offset = BitConverter.ToInt32(buffer, 0);

            return(readTile(context, offset));
        }
        /// <summary>
        /// 读取切片并保存
        /// </summary>
        /// <param name="context"></param>
        private void readTileFromBundle(bundlx context)
        {
            byte[] data = null;
            if (context.storageFormat == formatV1)
            {
                data = readTileFromBundleV1(context);
            }
            else
            {
                data = readTileFromBundleV2(context);
            }
            DateTime dt = DateTime.Now;

            using (FileStream stream = new FileStream(System.Environment.CurrentDirectory + "/" + string.Format("{0:yyyyMMddHHmmssffff}", dt) + ".jpg", FileMode.OpenOrCreate))
            {
                stream.Write(data, 0, data.Length);
            }
        }
        /// <summary>
        /// 读取切片
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        private byte[] readTileFromBundleV1(bundlx context)
        {
            var bundlxFileName = context.bundlxFileName;
            var bundleFileName = context.bundleFileName;
            var index          = context.index;

            using (FileStream file = new FileStream(bundlxFileName, FileMode.Open))
            {
                byte[] buffer     = new byte [5];
                byte[] bufferfile = new byte[file.Length];
                file.Read(bufferfile, 0, (int)file.Length);
                //读取bundlx文件存储该切片的位置
                buffer = bufferfile.Skip(16 + 5 * index).Take(4).ToArray();
                //偏移量
                var offset = BitConverter.ToInt32(buffer, 0);
                return(readTile(bundleFileName, offset));
            }
        }