在上一篇博客中,讲了一下使用GDAL从文件流中构造一个GDAL可以识别的数据来进行处理。原以为这个接口在C#中没有,仔细看了下GDAL库中源码,发现C#版本也有类似的函数,下面是GDAL库中的一个C#使用示例代码。
using System; using System.IO; using System.Runtime.InteropServices; using OSGeo.GDAL; /// <summary> /// 一个基于C#语言的简单示例,使用内存文件 /// </summary> class VSIMem { public static void usage() { Console.WriteLine("使用例子: vsimem [image file]"); System.Environment.Exit(-1); } public static void Main(string[] args) { if (args.Length != 1) //如果输入的参数不等于1,返回 usage(); byte[] imageBuffer; //定义一个buffer用来存储命令行输入的信息 //将输入的信息写入buffer中 using (FileStream fs = new FileStream(args[0], FileMode.Open, FileAccess.Read)) { using (BinaryReader br = new BinaryReader(fs)) { long numBytes = new FileInfo(args[0]).Length; imageBuffer = br.ReadBytes((int)numBytes); br.Close(); fs.Close(); } } //注册GDAL驱动 Gdal.AllRegister(); //构造内存文件名称,必须以/vsimem/开头 string memFilename = "/vsimem/inmemfile"; try { //从二进制流中构造内存文件 Gdal.FileFromMemBuffer(memFilename, imageBuffer); //使用GDAL打开数据进行处理 Dataset ds = Gdal.Open(memFilename, Access.GA_ReadOnly); Console.WriteLine("Raster dataset parameters:"); Console.WriteLine(" RasterCount: " + ds.RasterCount); Console.WriteLine(" RasterSize (" + ds.RasterXSize + "," + ds.RasterYSize + ")"); //将内存文件转存为一个GeoTiff文件 Driver drv = Gdal.GetDriverByName("GTiff"); if (drv == null) { Console.WriteLine("Can't get driver."); System.Environment.Exit(-1); } drv.CreateCopy("sample.tif", ds, 0, null, null, null); } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { Gdal.Unlink(memFilename); } } }