zoukankan      html  css  js  c++  java
  • (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以及bingdalcsharp目录下的8个DLL文件(gdal_csharp,gdal_wrap,gdalconst_csharp,gdalconst_wrap,ogr_csharp,ogr_warp,osr_csharp,osr_wrap)拷贝到VS项目的程序文件夹bin中
    注:解压目录中bingdal-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 plaincopyprint?

    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 plaincopyprint?

    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 plaincopyprint?

    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 plaincopyprint?

    1. Dataset ds = d.CreateCopy(path,dsin,1,null,null,null); 
  • 相关阅读:
    vs2005 水晶报表横向打印Bug
    petshop4.0 详解之七(PetShop表示层设计)
    petshop4.0 详解之八(PetShop表示层设计)
    在VS2005中使用VSS2005
    用DataFormatString格式化GridView
    GridView的高级用法
    水晶报表 打印时出现错误提示:出现通信错误。将停止打印
    POJ1182 食物链[并查集]
    并查集的基础知识
    HDOJ1269 迷宫城堡[强连通分量]
  • 原文地址:https://www.cnblogs.com/gywei/p/3387687.html
Copyright © 2011-2022 走看看