C#下使用GDAL库

GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。

下载:
这里不介绍编译方法,只下载和使用已经编译好的版本:
GDAL主页:http://www.gdal.org/,里面有下载、API、支持格式列表及说明等信息,
另外还有一个比较好的API网页

http://geoinformatics.tkk.fi/doc/Geo-GDAL/html/class_geo_1_1_g_d_a_l.html#92b259b91236580e33369984929f33d5
在主页中,有Download链接,http://trac.osgeo.org/gdal/wiki/DownloadingGdalBinaries,里面包含各平台的库文件下载,
这里介绍C#下的使用方法,进入http://www.gisinternals.com/sdk/进行下载,页面中有4种下载类型,其中第三种包含源代码,其它均只包含DLL及可执行文件,主要是版本不同
在该页面中,根据自己使用的Windows版本及VS版本下载相应的库文件
引用:
由于本人使用C#进行开发,这里用C#为例:
下载Release版本的包(不包含源代码),将解压后bin目录下所有DLL以及bin\gdal\csharp目录下的8个DLL文件(gdal_csharp,gdal_wrap,gdalconst_csharp,gdalconst_wrap,ogr_csharp,ogr_warp,osr_csharp,osr_wrap)拷贝到VS项目的程序文件夹bin中
注:解压目录中bin\gdal-data文件夹包含了一些库定义的信息以及坐标信息等,也可以拷贝到VS项目的程序文件夹bin(要启用gdal-data文件夹,还需要在程序中进行注明,使用 Gdal.SetConfigOption("GDAL_DATA", Application.StartupPath + "\\gdaldata"); 该语句中的路径根据实际情况变动)
在VS中,添加对gdal_csharp,gdalconst_csharp,ogr_csharp,osr_csharp四个DLL的引用
这样,就可以在程序中使用GDAL库了

添加了对GDAL库的引用后,开始使用GDAL库函数前,需要进行注册,
使用using OSGeo.GDAL;来引用GDAL的命名空间,
在程序中使用 Gdal.AllRegister();语句进行注册
GDAL使用时有一些环境变量,可以通过设置这些变量来更改全局设置
使用Gdal.SetConfigOption(string key, string value);函数来进行设置
其中Key代表环境变量名,Value代表环境变量的值,可用变量名及取值范围可参考
http://trac.osgeo.org/gdal/wiki/ConfigOptions#GDALOptions   以及
http://geoinformatics.tkk.fi/doc/Geo-GDAL/html/class_geo_1_1_g_d_a_l.html#92b259b91236580e33369984929f33d5
(两个地方都好像不太全)
如果重复为某个变量赋值,那么以最后那一次为准
其中使用比较多的有:
GDAL_FILENAME_IS_UTF8     中文路径名
GDAL_DATA DATA文件路径
GDAL_CACHEMAX 最大缓存区大小(IN BYTE),可以用Gdal.SetCacheMax函数代替
HFA_USE_RRD IMG文件是否生成RRD格式的金字塔
……

引用库文件并注册完毕后,即可使用GDAL库函数来打开影像文件
GDAL库中打开影像文件非常简单,使用Gdal.Open(string path,Acess eAcess)即可
第一个参数为影像路径,第二个参数为权限,分只读和可写两种
该函数返回值为Dataset类型
可以从该Dataset中获取到一些影像的基本信息,例如影像宽度和高度,波段数,坐标变换参数,坐标信息等
注:该函数获取到的Dataset中只包含影像的信息,并不包含影像所有像素的信息,要得到像素信息,需要用ReadRaster函数读取到数组中。

Dataset ds = Gdal.Open(rasterPath,Access.GA_ReadOnly)
int rasterX = ds.RasterXSize; //影像宽度
int rasterY = ds.RasterYSize; //影像高度
int bandCount = ds.RasterCount; //波段数
double tmpD = new double[6];
ds.GetGeoTransform(tmpD); //影像坐标变换参数
string proj = ds.GetProjection(); //影像坐标系信息(WKT格式字符串)
……
注:这里的GeoTransform(影像坐标变换参数)的定义是:通过像素所在的行列值得到其左上角点空间坐标的运算参数
例如:某图像上(P,L)点左上角的实际空间坐标为:
Xp = GeoTransform[0] + P * GeoTransform[1] + L * GeoTransform[2];
Yp = GeoTransform[3] + P * GeoTransform[4] + L * GeoTransform[5];

在创建影像前,需要先引用GDAL库的注册函数Gdal.AllRegister()

1:GDAL支持的影像格式

首先要明确GDAL所支持的影像格式,

http://www.gdal.org/formats_list.html  中列出了GDAL支持的影像格式,每一种影像格式在GDAL中都对应一种驱动(Driver),

网页中表格

第一列(Long Format Name)为影像格式的描述,点击该列还可通过链接查看该格式的详细信息,其中包括该格式的创建参数

第二列(Code)为该格式在GDAL中的代码,也是驱动的名称,

第三列(Creation)代表该格式是否支持创建影像

第四列(Georeferencing)未知,可能是指是否支持对该格式赋予空间信息

第五列(Maximum file size)为影像大小限制

第六列(Compiled by default)指是否默认支持该格式,还是需要其它插件的支持
2:获取驱动

在GDAL中创建影像,先需要明确待创建影像的格式,并获取到该影像格式的驱动:

Driver d = Gdal.GetDriverByName("HFA");

使用该函数获取影像格式的驱动,其中参数为驱动名称,可以在上文中表格第二列查得,例如HFA即为Erdas Img的驱动名

3:驱动的属性(元数据)
对每一种驱动(Driver),都有一些属性,通过d.GetMetadata("")可以获取到,结果是一个字符串数组,内容与网页上查到的基本相同,包括:是否允许创建,是否拷贝创建,支持的像素浓度类型,支持的创建参数等
4:调用Create函数创建影像
获取驱动后,使用

[csharp] view plaincopy

  1. d.Create(string uft8_path,int xSize,int ySize,int bands,DataType eType,string[] options) 

函数即可创建影像

该函数的参数为:

uft8_path:影像路径

xSize:宽度(像素值)

ySize:高度

bands:波段数

DataType:像素深度,可以设为Byte,Float,Int等等

options:创建影像的可选项设置,GDAL对不同的格式设置了不同的创建参数,详细信息参考上文中影像格式的介绍

该函数返回值为Dataset,与上一篇文件中打开影像得到的Dataset相同,可以在此基础上对影像数据进行操作

Create函数的示例代码:

[csharp] view plaincopy

  1. 1)Dataset dsout = d.Create(this.cut_savePathBox.Text, width, height, bands.Length, DataType.GDT_Byte, null);  
  2. 2)Dataset dsout = d.Create(this.cut_savePathBox.Text, width, height, bands.Length, DataType.GDT_Byte, n new string[] { "AUX=YES", "STATISTICS=YES" }); 

5:调用CreateCopy函数进行拷贝创建

CreateCopy函数支持从已打开的影像创建一个拷贝的影像,保留原影像的一些基本信息,例如宽高,波段数,坐标,偏移等

[csharp] view plaincopy

  1. d.CreateCopy(string utf8_path,Dataset src,int strict,string [] options,GDALProcessFuncDelegate callback,string callback_data) 

参数如下:

utf8_path:路径

src:打开的影像数据

strict:取值是0或者1,取值为非的时候说明即使不能精确匹配地由原数据转化为目标数据,程序也照样执行CreateCopy方法,不会产生致命错误。这种错误有可能是输出格式不支持输入数据格式象元的数据类型,或者是目标数据不支持写入空间参考等等[该参数介绍转自http://www.gissky.net/Article/645.htm]

options:与Create函数相同

callback,callback_data:传入一个委托,可用于实时显示创建数据的进度,不需要时可设为NULL

例如:

[csharp] view plaincopy

  1. Dataset ds = d.CreateCopy(path,dsin,1,null,null,null); 
posted @ 2013-10-24 17:36  vstion  阅读(7124)  评论(1编辑  收藏  举报