GDAL使用方法VC+C#
GDAL栅格图像操作GDAL是一个操作各种栅格和矢量(由ogr这个库实现)地理数据格式的开源库。
包括读取、写入、转换、处理各种栅格和矢量数据格式(有些特定的格式对一些操作如写入等不支持)。
即使不是进行地理遥感方面的应用研究,GDAL也是一个非常有用的库,因为它可以支持大量我们常见的图像数据,比如jpg,gif之类的。
完整的格式清单可以到此链接查看/formats_list.html。
而且已经有包括GoogleEarth在内的很多软件都是在使用GDAL作为后台库。
本文就以VC为开发平台介绍GDAL对栅格数据的操作方法。
Include目录是开发中需要的头文件,lib中是所需要的lib文件,在VC8中应当将其存放目录添加到目录列表中,选择菜单的“工具-选项-项目和解决方案-VC++目录”,分别在“包含文件”和“库文件”中将此两个目录添加进去。
在项目的属性页中,选择“配置属性-链接器-输入”,在“附加依赖项”中添加gdal_i-vc8.lib和gdal_id-vc8.lib两个使用GDAL中需要的静态库文件,或者在程序中添加以下两行代码也可以。
#pragma comment(lib, "gdal_i-vc8.lib")#pragma comment(lib, "gdal_id-vc8.lib")Bin目录下的动态链接库文件应当放置于程序能够访问的位置,比如windows\system32中。
此外,在程序中需要引入的头文件是gdal_priv.h。
现在开始用C++来对图像文件进行操作。
在打开文件之前需要首先注册所需要的驱动程序,一般来说我们可以默认注册所有支持的格式驱动,所使用的函数是GDALAllRegister()。
然后就是打开文件操作。
这里要说一个数据集的概念,也就是所谓的Dataset。
在GDAL中可以说数据的核心就是Dataset,简单来说可以将Dataset就理解为图像文件,比如说一个jpeg格式的文件就是一个数据集,当然其他一些文件格式可能在一个数据集中包含多于一个文件,比如可能除了图像数据文件外还可能会有一些附加信息文件等。
在数据集下最重要组成部分就是所谓的波段band,波段可多可少,比如一个RGB真彩色的图像就有3个波段,分别代表红色绿色和蓝色波段,如果是灰度图,那可能就只有一个波段,而很多遥感图像可能就会多于3个波段。
除了波段外,数据集中还含有图像相关的坐标系投影信息,元数据信息等数据。
文件的打开使用的是GDALOpen ( const char * pszFilename, GDALAccess eAccess ),pszFilename是文件路径,eAccess 是访问权限,可以是GA_ReadOnly只读,也可以是GA_Update 来对文件进行修改。
比如我们以只读模式打开一个tif文件:GDALDataset *poDataset; //数据集对象指针GDALAllRegister();//注册驱动poDataset = (GDALDataset *)GDALOpen( "c:\\terra335h_EV_250_Aggr500_RefSB_b0.tif", GA_ReadOnly );if( poDataset != NULL /*检查是否正常打开文件*/){//do something}delete poDataset; //释放资源在确认poDataset不是NULL的情况下就可以对图像数据集进行操作了。
首先来看一下有关这个图像的基本信息,比如长宽和波段数。
cout<<"RasterXSize:"<<poDataset->GetRasterXSize()<<endl;//x方向长度cout<<"RasterYSize:"<<poDataset->GetRasterYSize()<<endl;//y方向长度cout<<"RasterCount:"<<poDataset->GetRasterCount()<<endl;//波段数量我的这个文件输出结果如下:RasterXSize:5684RasterYSize:3655RasterCount:1这是个5684×3655的灰度图。
有关的投影信息可以由GetProjectionRef函数获得。
cout<<poDataset->GetProjectionRef()<<endl;输出一个字符串,是WKT格式的坐标投影信息,形如:GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS84",6378137,298.2572235630016,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["deg ree",0.0174532925199433],AUTHORITY["EPSG","4326"]]有关仿射变换和GCP的信息可以通过GetGeoTransform,GetGCPCount,GetGCPProjection,GetGCPs获得。
比如取得仿射变换的信息如下:double adfGeoTransform[6];//仿射参数poDataset->GetGeoTransform(adfGeoTransform);//获取参数然后就可以使用以下公式来计算仿射坐标了:Xgeo = adfGeoTransform[0] + Xpixel* adfGeoTransform[1] + Yline* adfGeoTransform[2]Ygeo = adfGeoTransform[3] + Xpixel* adfGeoTransform[4] + Yline* adfGeoTransform[5]这里的坐标系是以左上角为(0,0)点,向右向下为正向。
Xgeo表示转换后的地理x坐标,Ygeo是其相应y坐标,Xpixel是图像中像素的列坐标,Yline则是行坐标。
而且Xpixel和Yline的(0,0)坐标是图像左上角像素的左上角,因此左上角像素的中心坐标是Xpixel=0.5,Yline=0.5。
接下来,我们就开始进入到波段处理。
波段的获取使用GetRasterBand函数,参数是波段序号,从1开始。
比如还是上面那个图,只有一个波段,那要得到这个波段的操作如下:GDALRasterBand *poBand;poBand = poDataset->GetRasterBand( 1 );关于波段的信息也很多,我们捡几个主要的看看。
首先也是尺寸,在一个Dataset里所有波段的尺寸都一样,也就是上面用Dataset获取的数值,就不多数了。
然后是数据类型。
不同的图像格式的存储的数据类型是不一样的,比如我的这个tif用的是UInt16,也就是无符号的短整型,其他的用的可能就是byte型或其他类型的了。
获取波段数据的数据类型信息可以如下进行:cout<<"Data Type:"<<poBand->GetRasterDataType()<<endl;这里返回的信息是一个数据类型的编号,对应枚举类型GDALDataType中的一个值,在此tif的数值是2,对应GDT_UInt16,如果希望返回可读性比较强的信息,可以如下cout<<"DataType:"<<GDALGetDataTypeName(poBand->GetRasterDataType())<<endl;返回的是数据类型名的字符串:Data Type:UInt16关于波段色彩类型的情况类似数据类型,也是可以由GetColorInterpretation获取关于类型分类的GDALColorInterp枚举值,同时由GDALGetColorInterpretationName来返回名称字符串:cout<<"Color interpretation :"<<poBand->GetColorInterpretation()<<endl;cout<<"Colorinterpretation:"<<GDALGetColorInterpretationName(poBand->GetColorInterpretation())< <endl;输出:Color interpretation :1Color interpretation:Gray表明这个波段是个灰度图波段。
如果是真彩色图可能得到的结果就是Red,Blue或Green了。
GetMaximum和GetMinimum分别返回的是波段数据值可能的最大值和最小值,比如UInt16类型的波段最大值是65535,最小值就是0,知道这两个值就可以将图像转换成0~255的数值用于图像的显示操作了。
如:cout<<"Max :"<<poBand->GetMaximum()<<endl;cout<<"Min :"<<poBand->GetMinimum()<<endl;终于要说到具体数据的读写了。
关于波段数据的续写核心函数就是RasterIO。
这个函数可以将图像的某一个子块读入或写入。
CPLErr GDALRasterBand::RasterIO ( GDALRWFlag eRWFlag, int nXOff, int nYOff,int nXSize, int nYSize, void * pData, int nBufXSize, int nBufYSize,GDALDataType eBufType, int nPixelSpace, int nLineSpace )eRWFlag:读写标志位,GF_Read读,GF_Write写。
gdal库的学习和使用
gdal库的学习和使⽤1、windows下的编译 1.1、解压后打开nmake.opt,设置GDAL_HOME 1.2、进⼊vs的command promot,进⼊正常的那个即可,64位的没试过,可以参考gdal官⽹ 1.3、nmake /f makefile.vc 1.4、nmake /f makefile.vc install 1.5、nmake /f makefile.vc devinstall2、编译proj #PROJ_FLAGS =-DPROJ_STATIC #PROJ_INCLUDE =-Id:\projects\proj.4\src #PROJ_LIBRARY =d:\projects\proj.4\src\proj_i.lib 修改为: #PROJ_FLAGS =-DPROJ_STATIC PROJ_INCLUDE =-IF:\Work\3rdPart\proj-4.7.0\src PROJ_LIBRARY =F:\Work\3rdPart\proj-4.7.0\src\proj_i.lib 最上⾯的PROJ_FLAGS的作⽤经试验表明是这样⼦: 如果取消注释,那么运⾏的时候会主动提⽰确实proj.dll;如果加上注释,那么会输出Unable to load PROJ.4 library (proj.dll) (太假了)2、打开⽂件#include "gdal_priv.h"#include "cpl_conv.h"// for CPLMalloc()int main(){GDALDataset *poDataset;GDALAllRegister();poDataset = (GDALDataset *) GDALOpen( pszFilename, GA_ReadOnly );if( poDataset == NULL ){...;}gdal中⽂路径的问题不改变GDAL源代码,在⾃⼰调⽤GDALRegisterAll()和OGRAllRegiser()函数后,加上下⾯⼀句即可。
GDAL在C#中如何编译、安装以及使用简介
GDAL在C#中如何编译、安装以及使⽤简介编译准备……1.Gdal压缩包;2.修改。
修改Gdal中的bug,gdal\frmts\leveller\levellerdataset.cpp⽂件171⾏{ “?, kPI / 180.0, UNITLABEL_DEGREE },将“ “? ”修改为“ ”? “ ”,保存;修改Gdal根⽬录下的nmake.opt⽂件:MSVC_VER=1500(即选择VS2008);GDAL_HOME=“YourDir”,YourDir为你⾃⼰建⽴的⽤于存放编译⽣成的⽂件的地⽅,⾃⾏定义;修改部分结束修改完毕,编译真正开始…1.打开VS 2008命令⾏,定位到Gdal所在的⽂件夹; (或者cmd,到vc⽬录下运⾏vcvars32.bat)2.到gdal⽬录下,运⾏nmake /f makefile.vc;3.下⾯是:nmake /f makefile.vc install;4.接着:nmake /f makefile.vc devinstall,这步完成后GDAL_HOME处⽣成⼀系列的⽂件,其bin⽬录下会有gdal16.dll,视gdal版本⽽定。
5. 定位到gdal⽬录下的csharp⽂件夹。
6.敲⼊nmake /f makefile.vc,这步完成后会在csharp⽬录下⽣成8个dll⽂件。
将这8个⽂件拷贝到gdal16.dll 所在位置(见第4步)。
将四个*_CSharp.dll在项⽬中“添加引⽤”添加进来,其余gdal16.dll和另外四个编译C#时⽣成的dll⽂件拷贝到项⽬的debug下。
即可。
如果不把dll⽂件拷贝到debug下,将出现下⾯错误:“OSGeo.OGR.Ogr”的类型初始值设定项引发异常这样的问题。
这个问题是dll不全造成的,除了要引⽤的4个dll外,还有5个dll也要放到Debug⽬录下。
在编译C#下的gdal时,总共⽣成了9个dll,在编译的本机上,程序是通过环境变量path找到另外的⼏个dll的。
(C++)GDAL学习笔记——5全色影像与多光谱影像的融合
(C++)GDAL学习笔记——5全⾊影像与多光谱影像的融合任务将全⾊影像与多光谱影像融合。
原理使⽤的⽅法是HSI变换法,即先将多光谱影像选择RGB三个波段进⾏HSI变化得到H(⾊调)、S(饱和度)、I(亮度)三个波段。
之后按照全⾊波段的尺⼨将H和S两个波段进⾏缩放得到新的H和S波段,⽤全⾊波段替代I波段,将新的H和S波段与全⾊波段组合后进⾏HSI逆变换得到新的RGB波段影像。
HSI变换法的实现这⾥不详细介绍,可以参考这篇帖⼦。
代码/*实验5 将全⾊影像与多光谱影像融合时间 20210712这⾥使⽤的多光谱影像为BGR3波段*/#include<iostream>#include"gdal.h"#include"gdal_priv.h"#include"ogr_spatialref.h"#include<cmath>#include<algorithm>#include<Eigen/Dense>#define PI 3.1415using namespace std;using namespace Eigen;// ⽤来对图像进⾏缩放bool ImResize(MatrixXf srcM,MatrixXf &dstM);int main(){GDALAllRegister();char MulPath[]="D:\\Practice\\org\\exp5_mul.tif";char PanPath[]="D:\\Practice\\org\\exp5_pan.tif";char SavePath[]="D:\\Practice\\res\\exp5_res.tif";GDALDataset* mMulSet =(GDALDataset*)GDALOpen(MulPath, GA_ReadOnly);// 多光谱cout <<" E"<< endl;GDALDataset* mPanSet =(GDALDataset*)GDALOpen(PanPath, GA_ReadOnly);// 全⾊// 获取图像参数int mmX = mMulSet->GetRasterXSize();int mmY = mMulSet->GetRasterYSize();int mpX = mPanSet->GetRasterXSize();int mpY = mPanSet->GetRasterYSize();// 拉伸变换的参数float k1 =float(mpX)/ mmX;float k2 =float(mpY)/ mmY;// 取出波段GDALRasterBand* mMBandB = mMulSet->GetRasterBand(1);GDALRasterBand* mMBandG = mMulSet->GetRasterBand(2);GDALRasterBand* mMBandR = mMulSet->GetRasterBand(3);GDALRasterBand* mPBand = mPanSet->GetRasterBand(1);// 申请缓冲区unsigned short* mMBandB_ =new unsigned short[mmX*mmY];unsigned short* mMBandG_ =new unsigned short[mmX*mmY];unsigned short* mMBandR_ =new unsigned short[mmX*mmY];unsigned char* mPBand_ =new unsigned char[mpX*mpY];// 把数据写⼊缓冲区mMBandR->RasterIO(GF_Read,0,0, mmX, mmY, mMBandR_, mmX, mmY, GDT_Int16,0,0); mMBandG->RasterIO(GF_Read,0,0, mmX, mmY, mMBandG_, mmX, mmY, GDT_Int16,0,0); mMBandB->RasterIO(GF_Read,0,0, mmX, mmY, mMBandB_, mmX, mmY, GDT_Int16,0,0);mPBand->RasterIO(GF_Read,0,0, mpX, mpY, mPBand_, mpX, mpY, GDT_Byte,0,0);// 申请缓冲区IHSMatrixXf I1(mmX, mmY);MatrixXf H1(mmX, mmY);MatrixXf S1(mmX, mmY);// RGB 转 IHSfor(int m =0; m < mmY; m++)for(int n =0; n < mmX; n++){float R = mMBandR_[m*mmX + n];float G = mMBandG_[m*mmX + n];float B = mMBandB_[m*mmX + n];float r = R /(R + G + B);float g = G /(R + G + B);float b = B /(R + G + B);float h, s, i;float theta =acos(0.5*(r - g + r - b)/sqrt(pow(r - g,2)+(r - b)*(g - b)));if(b <= g){ h = theta;}else{ h =2* PI - theta;}s =1-3*min(r,min(g, b));i =(R + G + B)/(3*65535);I1(m,n)= i *65535;S1(m,n)= s *100;H1(m,n)= h *180/ PI;}// 将S1 和 H1 拉伸MatrixXf S2(mpX, mpY);MatrixXf H2(mpX, mpY);MatrixXf I2(mpX, mpY);ImResize(H1, H2);ImResize(S1, S2);//for (int ii = 0; ii < 20; ii++) { cout << H1(ii, ii) <<" "<< H2(ii, ii) << endl; }for(int i =0; i < mpY; i++)for(int j =0; j < mpX; j++){I2(i, j)=float(mPBand_[i*mpX + j]);}cout <<"RGB 转 HSI完成"<< endl;/******************HSI 转 RGB**********************/MatrixXf RR(mpX, mpY);MatrixXf GG(mpX, mpY);MatrixXf BB(mpX, mpY);for(int k =0; k < mpX*mpY; k++){float H =H2(k), S =S2(k), I =I2(k);float h = H*PI /180;float s = S /100;float i = I /255;float r, g, b;if(h >=0&& h <2* PI /3){b = i*(1- s);r = i*(1+ s*cos(h)/cos(PI /3- h));g =3* i -(b + r);}else if(h <4* PI /3){r = i*(1- s);g = i*(1+ s*cos(h -2* PI /3)/cos(PI - h));b =3* i -(g + r);}else{g = i*(1- s);b = i*(1+ s*cos(h -4* PI /3)/cos(5* PI /3- h));r =3* i -(g + b);}RR(k)= r *255;GG(k)= g *255;BB(k)= b *255;}// 将计算得到的RGB申请缓冲区并放⼊unsigned short* mRR =new unsigned short[mpX*mpY];unsigned short* mGG =new unsigned short[mpX*mpY];unsigned short* mBB =new unsigned short[mpX*mpY];for(int y =0; y < mpY; y++){for(int x =0; x < mpX; x++){mRR[y*mpX + x]=(unsigned short)RR(y, x);mGG[y*mpX + x]=(unsigned short)GG(y, x);mBB[y*mpX + x]=(unsigned short)BB(y, x);}}cout <<"HSI 转 RGB 完成"<< endl;// 创建输出数据集GDALDriver* hDriver =GetGDALDriverManager()->GetDriverByName("GTiff");GDALDataset* mSaveSet = hDriver->Create(SavePath, mpX, mpY,3, GDT_UInt16,NULL); // 获取影像的地理信息和投影信息double geoInformation[6];mPanSet->GetGeoTransform(geoInformation);const char* gdalProjection = mPanSet->GetProjectionRef();// 将影像的地理信息写到纠正后影像数据集中// 将影像的地理信息写到纠正后影像数据集中mSaveSet->SetGeoTransform(geoInformation);mSaveSet->SetProjection(gdalProjection);// 将波段数据写⼊mSaveSet->GetRasterBand(1)->RasterIO(GF_Write,0,0, mpX, mpY, mRR, mpX, mpY, GDT_UInt16,0,0); mSaveSet->GetRasterBand(2)->RasterIO(GF_Write,0,0, mpX, mpY, mGG, mpX, mpY, GDT_UInt16,0,0); mSaveSet->GetRasterBand(3)->RasterIO(GF_Write,0,0, mpX, mpY, mBB, mpX, mpY, GDT_UInt16,0,0);delete[] mMBandB_, mMBandG_, mMBandR_;delete[] mRR, mGG, mBB;GDALClose(mSaveSet);GDALClose(mMulSet);GDALClose(mPanSet);GDALDestroyDriverManager();cout <<"程序运⾏完毕"<< endl;getchar();return0;}bool ImResize(MatrixXf srcM, MatrixXf & dstM){int msW = srcM.cols();int msH = srcM.rows();int mdW = dstM.cols();int mdH = dstM.rows();// 计算缩放参数float k1 =float(mdW)/ msW;float k2 =float(mdH)/ msH;for(int h =0; h < mdH; h++){for(int w =0; w < mdW; w++){float tmpX = w / k1;float tmpY = h / k2;dstM(h, w)=srcM(int(tmpY),int(tmpX));}}return false;}结果展⽰多光谱影像:全⾊影像:融合影像:ENVI的Brovey融合结果:结语对⽐了⼀下使⽤ENVI得到的融合结果,是差不多的,不过在使⽤MATLAB进⾏的时候,不知为何融合影像的⾊调有些不同,暂时没有深究,留待以后吧。
GDAL栅格图像操作
GDAL是一个操作各种栅格和矢量(由ogr这个库实现)地理数据格式的开源库。
包括读取、写入、转换、处理各种栅格和矢量数据格式(有些特定的格式对一些操作如写入等不支持)。
即使不是进行地理遥感方面的应用研究,GDAL也是一个非常有用的库,因为它可以支持大量我们常见的图像数据,比如jpg,gif之类的。
完整的格式清单可以到此链接查看/formats_list.html。
而且已经有包括GoogleEarth在内的很多软件都是在使用GDAL作为后台库。
本文就以VC8为开发平台介绍GDAL对栅格数据的操作方法。
下载安装GDAL的主页是/,下载安装的说明链接都能在上面找到,但是要说明的是直接在其主页上下载的GDAL对VC8的支持不太好。
因此可以直接到/Distrib/gdal.html去下载针编译好的针对VC8的GDAL,当前版本是1.41。
环境配置将压缩包下载后,解压到硬盘中,其目录结构如下:--\\bin\data\include\libInclude目录是开发中需要的头文件,lib中是所需要的lib文件,在VC8中应当将其存放目录添加到目录列表中,选择菜单的“工具-选项-项目和解决方案-VC++目录”,分别在“包含文件”和“库文件”中将此两个目录添加进去。
在项目的属性页中,选择“配置属性-链接器-输入”,在“附加依赖项”中添加gdal_i-vc8.lib和gdal_id-vc8.lib两个使用GDAL中需要的静态库文件,或者在程序中添加以下两行代码也可以。
#pragma comment(lib, "gdal_i-vc8.lib")#pragma comment(lib, "gdal_id-vc8.lib")Bin目录下的动态链接库文件应当放置于程序能够访问的位置,比如windows\system32中。
此外,在程序中需要引入的头文件是gdal_priv.h。
现在开始用C++来对图像文件进行操作。
GDAL、Prj.4和GEOS库的编译与引用
GDAL的编译官方网站:/下载地址:/gdal/编译版本:GDAL1.8.0编译平台:Window XP(32位)+Visual Studio2008编译步骤:1、解压下载文件gdal180.zip到C:\gdal-1.8.0。
2、点击“开始—运行”,输入“cmd”,进入控制台界面。
3、编译C++版本gdal,依次输入以下命令:1)C:\Program Files\Microsoft Visual Studio9.0\VC\bin\vcvars32.bat2)cd C:\gdal-1.8.03)nmake/f makefile.vc4)nmake/f makefile.vc install5)nmake/f makefile.vc devinstall4、如需编译C#版本gdal,接着输入以下命令:1)cd C:\gdal-1.8.1\swig\csharp2)nmake/f makefile.vc工程引用:1、C++工程引用GDAL1)从C:\warmerda\bld\lib目录下复制gdal_i.lib文件,从C:\warmerda\bld\bin目录下复制gdal18.dll文件,以及复制C:\warmerda\bld\include整个文件夹到C++工程目录下。
2)以Visual C++6.0为例,点击“Project-Settings”菜单,在C/C++页面,在[Category]项选择[Preprocessor]选项,在[Additional include directories]项下添加“include”值,即将编译的gdal的头文件目录添加到工程中。
转到Link页面,在[Object/library modules]选项下添加“gdal_i.lib”3)在需要使用gdal的时候添加相应的头文件。
2、C#工程引用GDAL1)从C:\gdal-1.8.0\swig\csharp目录下复制gdal_csharp.dll、gdal_wrap.dll、gdalconst_csharp.dll、gdalconst_wrap.dll、ogr_csharp.dll、ogr_wrap.dll、osr_csharp.dll、osr_wrap.dll,以及从C:\warmerda\bld\bin目录下复制gdal18.dll共9个文件到C#工程中。
如何在CSharp中使用GDAL
在"C:\gdal-runtime\bin"文件夹内已经生成了gdal15.dll文件,这是GDAL库的核心,不管采用何种开发方式,最终都由这个DLL文件来执行实质性的操作。
9、编译C#源文件。
键入“cd C:\gdal-1.5.0\swig\csharp”,进入C#源文件所在的文件夹。
键入“nmake /f makefile.vc”,编译完毕后生成8个DLL文件:gdal_csharp.dll、gdalconst_csharp.dll、 ogr_csharp.dll、osr_csharp.dll和gdal_wrap.dll、gdalconst_wrap.dll、 ogr_wrap.dll、osr_wrap.dll。前面4个文件名中都含有"csharp",用法与另外4个稍有不同,稍后详细讨论。
6、修改编译配置文件夹“C:\gdal-1.5.0\nmake.opt”。以下是第41至第43行的内容:
!IFNDEF GDAL_HOME
GDAL_HOME = "C:\warmerda\bld"
!ENDIF
默认的情况下,GDAL将会安装到"C:\warmerda\bld"文件夹内,为了更好地了解安装过程,我们把第42行修改成如下内容:
12、在VS2005 CSharp项目中添加对GDAL的引用。新建一个CShapr应用程序项目,然后添加对C:\gdal-runtime\bin中4个含有"csharp"的DLL文件的引用。至此我们就可以使用GDAL的功能了。为了测试GDAL是否可以运行,我们为窗体的Load事件增加如下的代码:
}
}为了运行程序,Open方法的第一个参数@"C:\F-49-32-(10).tif"应改成你本机上图像文件所在的路径。如果运行正常的话将弹出一个对话框,显示图像的宽度和高度。
GDAL库介绍、安装与使用介绍
1.GDAL介绍GDAL是一个转换各种栅格数据格式的库。
包括读取、写入、转换、处理各种栅格数据格式(有些特定的格式对一些操作如写入等不支持)。
它使用了一个单一的抽象数据模型就支持了大多数的栅格数据(GIS对栅格,矢量,3D数据模型的抽象能力实在令人叹服)。
当然除了栅格操作,这个库还同时包括了操作矢量数据的另一个有名的库ogr(转换矢量GIS数据),这样这个库就同时具备了操作栅格和矢量数据的能力,目前ogr能够支持的数据格式包括:Arc/Info Binary Coverage、DWG、ESRI Personal GeoDatabase、ArcSDE、ESRI Shapefile、GML、GRASS、Mapinfo File、Microstation DGN、ODBC、Oracle Spatial 和PostgreSQL等。
应该说,这就基本包括了我们平常用到的所有矢量型GIS文件格式了。
Gdal支持的栅格数据格式参阅/formats_list.html2.GDAL安装(1)下载gdal的安装文件,/gdal/gdal142.zip,解压到某目录下,如C:\gdalsrc下。
这里我们假定VC6的安装在默认目录C:\Program Files\Microsoft Visual Studio8下。
(2)启动cmd,即打开控制台窗口。
进入VC6的安装目录下,如cd C:\Program Files\MicrosoftVisual Studio8\VC\bin\,在此目录下有个文件VCVARS32.BAT,执行一下这个文件,然后重新回到C:\gdalsrc下。
运行命令nmake /f makefile.vc。
编译完成后,用记事本打开文件C:\gdalsrc\nmake.opt,根据自己的情况修改GDAL_HOME = 这一行,这个指的是最终GDAL的安装目录,比如说我们安装在C:\GDAL,那么这一行就是GDAL_HOME = "C:\GDAL",在C:\gdalsrc下执行nmake /f makefile.vc install,然后是nmake /f makefile.vc devinstall,然后我们需要的东西就安装到了C:\GDAL下。
GDAL编译与功能介绍
} delete poSlopeDS; return 0;
}
• • • • • • • • • • • • • • ( const char * pszFilename, int nXSize, int nYSize, int nBands, GDALDataType eType, char ** papszOptions ) pszFilename为储存影像路径 nXSize为影像的行值 nYSize为影像的列值 nBands为波段数 eType为影像数据类型 papszOptions为一些特殊的控制参数,通常为NULL
GDAL编译与功能介绍
王健 2011-11-16
• GDAL(Geospatial Data Abstraction Library)是一个开源栅格空间数据转换库。 它利用抽象数据模型来表达所支持的各种 文件格式。并有一系列命令行工具来进行 数据转换和处理。
• 使用GDAL开发的软件:
• • • • • • • • ESRI ArcGIS 9.2+ Google Earth ERDAS ER Viewer OpenEV MapServer FWTools IDRISI …….
• • • • • • • • • • • • • • • • • • • • • •
else
{
dx = ((win[0] + win[3] + win[3] + win[6]) (win[2] + win[5] + win[5] + win[8])); dy = ((win[6] + win[7] + win[7] + win[8]) (win[0] + win[1] + win[1] + win[2])); // // // // // SOBEL算子为3X3的矩阵, 如下所示为下标 0 3 6 1 4 7 2 5 8
怎样安装GDAL以及使用
安装及其使用GDAL
1.首先下载GDAL安装包将其解压到指定目录如:C:\
2.启动cmd,即打开控制台窗口。
进入Microsoft Visual Studio 10.0的安装目录下,如
cd C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\,在此目录下有个文件VCVARS32.BAT,执行一下这个文件。
这样就执行完毕
3.然后重新回到C:\下。
运行命令nmake /f makefile.vc。
编译完成后,用记事本打开文
件C:\gdalsrc\nmake.opt,根据自己的情况修改GDAL_HOME = 这一行,这个指的是最终GDAL的安装目录,比如说我们安装在C:\GDAL,那么这一行就是GDAL_HOME =
"C:\GDAL",在C:\gdalsrc下执行nmake /f makefile.vc install,然后是nmake /f makefile.vc devinstall,然后我们需要的东西就安装到了C:\GDAL下。
这样就完成了安装,将安装包安装在C:\GDAL下。
(GDAL这个文件夹是我们自己在cmd外新建的)
在使用时,我们首先包涵头文件
#include”gdal_priv.h”
同时必须注意在在project property下点击c++ general 选中第一项additional。
gdal 矢量交合并 -回复
gdal 矢量交合并-回复GDAL(Geospatial Data Abstraction Library)是一个开源的地理空间数据处理库,它提供了许多功能强大的工具来读取、写入、转换和分析地理空间数据。
其中之一是矢量交集与合并功能,可以将多个矢量数据集进行交集运算或者合并成一个数据集。
本文将逐步介绍如何使用GDAL进行矢量交集和合并的操作。
第一步:安装GDAL库要使用GDAL进行矢量交集和合并操作,首先需要安装GDAL库。
GDAL库有多种语言接口,包括Python、C、C++等。
在本文中,我们将使用Python接口示例代码进行演示。
可以通过pip命令来安装Python的GDAL库,命令如下:bashpip install GDAL安装完成后,我们可以开始编写代码。
第二步:导入GDAL库导入GDAL库是使用GDAL功能的第一步,示例代码如下:pythonfrom osgeo import ogrfrom osgeo import gdal这里我们导入了GDAL库中的ogr和gdal模块。
第三步:打开矢量数据集在进行矢量交集和合并操作之前,我们需要先打开待处理的矢量数据集。
GDAL库提供了`OpenEx`方法用于打开矢量数据集,示例代码如下:python# 打开第一个矢量文件src_ds1 = ogr.OpenEx('path/to/vector1.shp')# 打开第二个矢量文件src_ds2 = ogr.OpenEx('path/to/vector2.shp')这里我们假设待处理的矢量数据集文件分别为`vector1.shp`和`vector2.shp`,需要根据实际情况修改文件路径。
第四步:获取图层在打开矢量数据集后,我们需要获取矢量数据集中的图层。
GDAL库提供了`GetLayer`方法用于获取图层,示例代码如下:python# 获取第一个矢量数据集的图层layer1 = src_ds1.GetLayer()# 获取第二个矢量数据集的图层layer2 = src_ds2.GetLayer()第五步:执行矢量交集与合并操作在获取图层后,我们可以执行矢量交集与合并操作。
