Gdal库的简单使用及注意事项(C++版本和C#版本)

来源:互联网 发布:陈国良院士 知乎 编辑:程序博客网 时间:2024/06/05 16:48

C++版本

VS2010,gdal1.9

1、建立工程

2、在工程的属性对话框中,配置属性——C/C++——常规,在“附加包含目录中将GDAL中的include文件夹路径填写入输入框

3、配置属性——链接器——常规,在附加库目录中将GDAL的lib文件夹路径填写完整

4、配置属性——链接器——输入,在附加依赖项填入gdal_i.lib

 配置完毕。

填写代码,编译。将gadl1.9.dll文件复制到编译出来的exe所在目录。

示例代码:(摘抄自李民录的GDAL代码详解)

#include "stdafx.h"

#include "gdal_priv.h" 
#include "cpl_conv.h" // for CPLMalloc()
int main() 
{ //注册文件格式
GDALAllRegister();
//解决中文路径问题
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");
const char* pszFile = "D:\\test.tiff“”
GDALDataset *poDataset; //使用只读方式打开图像 
poDataset = (GDALDataset *) GDALOpen( pszFile, GA_ReadOnly ); 
if( poDataset == NULL ) 

printf( "File: %s 不能打开!\n", pszFile); 
return 0; 
}
//输出图像的格式信息 
printf( "Driver: %s/%s\n", poDataset->GetDriver()->GetDescription(), poDataset->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME ) );
//输出图像的大小和波段个数
printf( "Size is %dx%dx%d\n", poDataset->GetRasterXSize(), poDataset->GetRasterYSize(), poDataset->GetRasterCount() );
//输出图像的投影信息 
if( poDataset->GetProjectionRef() != NULL ) printf( "Projection is `%s'\n", poDataset->GetProjectionRef() );
//输出图像的坐标和分辨率信息 
double adfGeoTransform[6];
if( poDataset->GetGeoTransform( adfGeoTransform ) == CE_None )
{
printf( "Origin = (%.6f,%.6f)\n", adfGeoTransform[0], adfGeoTransform[3] );
printf( "Pixel Size = (%.6f,%.6f)\n", adfGeoTransform[1], adfGeoTransform[5] );
}
GDALRasterBand *poBand; int nBlockXSize, nBlockYSize; int bGotMin, bGotMax; double adfMinMax[2];
//读取第一个波段
poBand = poDataset->GetRasterBand( 1 );
//获取图像的块大小并输出 
poBand->GetBlockSize( &nBlockXSize, &nBlockYSize ); printf( "Block=%dx%d Type=%s, ColorInterp=%s\n", nBlockXSize, nBlockYSize, GDALGetDataTypeName(poBand->GetRasterDataType()), GDALGetColorInterpretationName( poBand->GetColorInterpretation()) );
//获取该波段的最大值最小值,如果获取失败,则进行统计
adfMinMax[0] = poBand->GetMinimum( &bGotMin ); adfMinMax[1] = poBand->GetMaximum( &bGotMax );
if( ! (bGotMin && bGotMax) ) GDALComputeRasterMinMax((GDALRasterBandH)poBand, TRUE, adfMinMax);
printf( "Min=%.3fd, Max=%.3f\n", adfMinMax[0], adfMinMax[1] );
//输出图像的金字塔信息 
if( poBand->GetOverviewCount() > 0 ) printf( "Band has %d overviews.\n", poBand->GetOverviewCount() );
//输出图像的颜色表信息 
if( poBand->GetColorTable() != NULL ) printf( "Band has a color table with %d entries.\n", poBand->GetColorTable()->GetColorEntryCount() );
float *pafScanline; int nXSize = poBand->GetXSize(); //读取图像的第一行数据
pafScanline = (float *) CPLMalloc(sizeof(float)*nXSize); poBand->RasterIO( GF_Read, 0, 0, nXSize, 1, pafScanline, nXSize, 1, GDT_Float32, 0, 0 );
CPLFree(pafScanline);
//关闭文件
GDALClose((GDALDatasetH )poDataset);
 char c;
 c=getchar();// 
}



C#版本

1.建立工程,将以_xsharp。dll结尾的dll添加到引用中,添加代码,编译,然后将gdall19.dll复制到exe所在目录

代码如下:(摘抄自李民录的GDAL代码详解,有部分改动)

 Console.WriteLine("");
            //注册文件格式
            Gdal.AllRegister();
            //解决中文路径乱码的问题
            //Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");


            string strFile = "D:\\.test。tiff“”
            //使用只读方式打开图像
            Dataset ds = Gdal.Open(strFile,Access.GA_ReadOnly);


            Driver drv = ds.GetDriver();


            //输出图像的格式信息
            Console.WriteLine("Dirver:"+drv.GetDescription());
            Console.WriteLine("Dirver:"+drv.LongName);


            //输出图像的大小和波段个数
            Console.WriteLine("RasterCount:"+ds.RasterCount);
            Console.WriteLine("RasterSize(" + ds.RasterXSize+","+ds.RasterYSize+")");


            //输出图像的投影信息
            Console.WriteLine("Projection:"+ds.GetDescription());


            //输出图像的坐标和分辨率信息
            double[] adfGeoTransform=new double[6];
            ds.GetGeoTransform(adfGeoTransform);
            Console.WriteLine("origin=("+adfGeoTransform[0]+","+adfGeoTransform[3]+")");
            Console.WriteLine("PixelSize=(" + adfGeoTransform[1] + "," + adfGeoTransform[5] + ")");
            Console.WriteLine("");


            //读取第一个波段
            Band band = ds.GetRasterBand(1);
            double val;
            int hasval;
            band.GetMinimum(out val ,out hasval);


            if (hasval != 0)
                Console.WriteLine("mininum:"+val.ToString());


            band.GetMaximum(out val, out hasval);
            if (hasval != 0)
                Console.WriteLine("maxinum:" + val.ToString());


            int nXSice = ds.RasterXSize;


            float[] pafScanLine;
            pafScanLine=new float[nXSice];
            band.ReadRaster(0,0,nXSice,1,pafScanLine,nXSice,1,0,0);
            Console.ReadLine();

原创粉丝点击