/// <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)); } }