GDAL使用方法VC+C#
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()第五步:执行矢量交集与合并操作在获取图层后,我们可以执行矢量交集与合并操作。
使用C#vs2008编译GDAL1.8.1
一、简单的编译1、使用VisualStudio IDE编译首先进入GDAL的源代码目录,可以看到有几个sln为后缀的文件名,比如makegdal10.sln,makegdal80.sln,makegdal71.sln,makegdal90.sln 。
这些文件是VisualStudio的工程文件,后面的数字对应的VS的版本号,71表示的VS2003,80表示VS2005,90表示VS2008,还有10表示VS2010等。
根据自己电脑安装的VS 版本,打开对应的文件,如下图所示(使用VS2008SP1版本,打开makegdal90.sln文件):图3 VS2008打开编译GDAL1.8.1然后在左侧解决方案右键,弹出菜单中选择“生成”或者“重新生成”命令,然后GDAL就会开始编译,等待输出窗口中提示,执行完成,生成成功等信息后,就表示GDAL已经完成编译。
同时会在GDAL的源代码目录中会出现gdal.lib,gdal_i.lib,gdal18.dll等文件,如果你没有修改GDAL中的nmake.opt文件的话,那么同时会在你的C盘中会出现一个叫“C:\warmerda\bld”的文件夹,里面会包含三个文件夹,分别是bin,data和html。
其中bin文件夹中存放的是编译出来的GDAL的可执行程序,包括GDAL提供的十几个工具集;data文件夹就是在第一节中的介绍的data文件夹;html文件夹中存放的是各种数据格式的说明文档。
2、使用cmd命令行编译使用cmd命令行编译,首先在“开始菜单\所有程序\Microsoft Visual Studio 2008\Visual Studio Tools\ Visual Studio 2008命令提示”,点击“Visual Studio 2008 命令提示”会弹出下面的界面:然后使用cd命令,切换到GDAL的源代码目录,如下图所示:切换到GDAL的源代码目录后,依次敲入下面的命令行后回车,等待编译结束即可。
c语言gdal案例
c语言gdal案例GDAL(Geospatial Data Abstraction Library)是一个用于读取和写入栅格地理空间数据格式的开源库。
以下是一个简单的C语言GDAL案例,演示如何使用GDAL库读取和打印栅格数据的基本信息。
请注意,为了运行此代码,您需要安装GDAL库并确保有一些栅格数据文件可供读取。
```c#include"gdal.h"#include"cpl_conv.h"int main(){//注册GDAL驱动GDALAllRegister();//打开栅格数据文件GDALDatasetH hDataset=GDALOpen("path/to/your/rasterfile.tif",GA_ReadOnly);if(hDataset==NULL){printf("无法打开栅格数据文件!\n");return1;}//获取栅格数据集的基本信息int width=GDALGetRasterXSize(hDataset);int height=GDALGetRasterYSize(hDataset);int bands=GDALGetRasterCount(hDataset);printf("栅格数据集信息:\n");printf("宽度:%d像素\n",width);printf("高度:%d像素\n",height);printf("波段数:%d\n",bands);//获取第一个波段的数据GDALRasterBandH hBand=GDALGetRasterBand(hDataset,1);float*data=(float*)CPLMalloc(sizeof(float)*width*height);GDALRasterIO(hBand,GF_Read,0,0,width,height,data,width,height,GDT_Float32,0,0);//打印第一个波段的前10个像素值printf("\n第一个波段的前10个像素值:\n");for(int i=0;i<10;++i){printf("%f",data[i]);}printf("\n");//释放资源CPLFree(data);GDALClose(hDataset);return0;}```这个例子打开了一个栅格数据文件(TIFF格式),获取了基本的数据集信息(宽度、高度、波段数),然后读取了第一个波段的前10个像素值并打印出来。
GDAL库安装
简单介绍:OGR是一个读取和处理GSI矢量数据的库。
这个库可以读取和处理多种流行的矢量数据,OGR是GDAL(/)的一个部分,只要你安装了GDAL库,就已经拥有了OGR库。
一、安装:1.先下载一个GDAL版本(C++)(/gdal/wiki/BuildHints)。
2.然后打开控制(DOS)台,找到.....\Microsoft Visual Studio .NET 2010\Vcbin\vcvars32.bat,注册VC编译环境。
进入VS安装目录执行VS目录下的VCV ARS32 文件3.然后把GDAL库放到一个目录下,如C:\gdal-1.9.1\gdal-1.9.1;用VS打开并打开文件夹下的nmake.opt修改GDAL_HOME = "C:\GDAL"把路径改到需要把gdal安装的地方。
cd进入刚才源文件的解压目录C:\gdal-1.9.1\gdal-1.9.1。
将gdal解压到C盘修改nmakecd进入解压目录4.然后在DOS中依次输入:nmake /f makefile.vcnmake /f makefile.vc installnmake /f makefile.vc devinstall中间等待编译处理。
处理完后系统将会把我们需要的文件拷贝到开始设定的安装目录,如刚才设置的C:\GDAL二、应用1.在新建项目下:属性->C/C++->常规->附加包含目录:"C:\GADL\include"。
属性->链接器->常规->附加库目录:"C:\GADL\lib".属性->连接器->输入->附加依赖项:gdal_i.lib.2. 将C:\GDAL\bin\gdal14.dll拷贝到vs新建项目的debug文件夹中。
(否则运行时会提示找不到gdal14.dll)添加所需的头文件就可以用了。
c++中调用GDAL设置方法
c++中调用GDAL设置方法
c++中调用GDAL设置方法(2010-04-23 18:38:40)转载▼
标签:gdal c 编程it 分类:GDAL
Visual C++.net环境下的设置跟VC6.0差不多,。
1、先要在“工具->选项->项目和解决方案->VC++目录”下分别选择包含文件和库文件下拉菜单添加include目录和lib目录;
2、在“项目->(工程名)属性->配置属性->链接器->输入”页面中的“附加依赖项”中添加gdal_i.lib;
3、添加完后需要在程序头文件添加引用#include "gdal_priv.h"和#include "gdal.h"
4. 将下载下来的压缩包bin目录下的所有dll文件(这些文件是GDAL相关的dll文件,是GDAL_Java的dll需要调用的)拷贝至正确的位置(首先编译一下GDAL的debug版本,将编译生成的文件,主要有gdal18.dll,gdal_i.exp,gdal_i.lib,gdal.lib,gdal18.pdb,gdal18.ilk,gdal18.exp等文件,将gdal18开头的文件拷贝到自己工程的生成目录的DEBUg目录中,然后调试自己的程序,在执行到GDALOpen函数(或者其他GDAL的函数)时按F11键,就会进入到GDAL的源代码中进行调试GDAL代码)。
GDAL使用
step1 Edit nmake.opt file
Open G:/gdal/nmake.opt with notepad, and modify these lines:
1 GDAL_HOME = "../gdal"
The actual location of gdal package.
GDAL/OGR 1.6.0
与Gdal类似地,与Gdal库一起的OGR类库,提供了对矢量数据的相关操作。
详细资料请参考GDAL
流浪者N应用Gdal是为了用C#实现对HDF文件的操作。
下面为流浪者N编译支持HDF4、HDF5的Gdal库的操作,首先声明流浪者N这么编译出的Gdal仍然不支持HDF,这里写下一为记录;二为交流,
FWTools2.2.8,还是FWTools2.2.8存在bug,总之有异常,说是“OSGeo.GDAL.GdalPINVOKE的类型初始值设
gdal_gdal_csharp.dll
gdal_ogr_csharp.dll
gdal_osr_csharp.dll
gdal_gdalconst_csharp.dll
gdal_gdal_wrap.dll
gdal_ogr_wrap.dll
gdal_osr_wrap.dll
gdal_gdalconst_wrap.dll
(以下内容是网络搜索到的,当时忘记记录网址,所以对于出处没有表明,在此对原作者表示歉意。希望对需要的朋友有所帮助。)
GDAL编译时机器中必须装有VC。
2007-08-26 | How to compile GDAL/OGR C# interface
标签: GDAL OGR Csharp interface
gdal编译说明
GDAL库编译说明一、windows环境下编译1.下载gdal源码并且解压2.打开gdal文件夹下的nmake.opt修改GDAL_HOME = "C:\warmerda\bld"把路径改到需要把gdal安装的地方。
3.编译安装在vc控制台中进入gdal文件夹,后面就依次运行nmake /f makefile.vcnmake /f makefile.vc installnmake /f makefile.vc devinstallnmake /f makefile.vc clean4.如果编译出现出错如果是连接错误,肯定是lib环境变量没有设置对如果是语法错误,则可能是include没有设置好,或者源码对vc编译器有些不好,需要手工改改源码。
编译完成后在安装目录中可以找到gdal的动态库。
二、Linux环境下编译1.编译下载源程序,解压,运行以下三条命令./configuremakemake install对于64位操作系统编译会出现如下错误/usr/lib/libexpat.so: could not read symbols: File in wrong format是说expat是32位的不能在64位机器上。
解决办法如下:cd /usr/libmv libexpat.so libexpat.so.32ln –s /usr/lib64/libexpat.so libexpat.so然后再编译即可。
编译完成后在/usr/local/lib中可以找到gdal的动态库。
三、gdal java 编译1.windows环境进入<gdal-dir>\swig\java修改java.opt文件,指定jdk的路径,<gdal-dir>为gdal文件夹。
在vc控制台中进入<gdal-dir>\swignmake -f makefile.vc java将编译好的动态库放到需要使用它的地方:gdalconstjni.dllgdaljni.dllogrjni.dllosrjni.dllgdal.jar2.Linux环境进入<gdal-dir>\swig\java修改java.opt文件,指定jdk的路径,<gdal-dir>为gdal文件夹。
第六节 GDAL的使用与图片的显示
第六节GDAL的使用一.什么是GDALGDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。
它利用抽象数据模型来表达所支持的各种文件格式。
它还有一系列命令行工具来进行数据转换和处理。
GDAL提供对多种栅格数据的支持,包括Arc/Info ASCII Grid(asc),GeoTiff (tiff),Erdas Imagine Images(img),ASCII DEM(dem) 等格式。
GDAL使用抽象数据模型(abstract datamodel)来解析它所支持的数据格式,抽象数据模型包括数据集(dataset),坐标系统,仿射地理坐标转换(Affine GeoTransform),大地控制点(GCPs),元数据(Metadata),栅格波段(Raster Band),颜色表(ColorTable),子数据集域(Subdatasets Domain),图像结构域(Image_StructureDomain),XML域(XML:Domains)。
GDALMajorObject类:带有元数据的对象。
GDALDdataset 类:通常是从一个栅格文件中提取的相关联的栅格波段集合和这些波段的元数据;GDALDdataset也负责所有栅格波段的地理坐标转换(georeferencing transform)和坐标系定义。
GDALDriver类:文件格式驱动类,GDAL会为每一个所支持的文件格式创建一个该类的实体,来管理该文件格式。
GDALDriverManager类:文件格式驱动管理类,用来管理GDALDriver类。
二.GDAL的安装GDAL编译详细过程:1)网上/proj/下载最新版本的proj开源投影库,解压到c:\下然后使用VS的命令行工具进入到该目录,执行nmake makefile.vc 2)网上/geos/下载最新版本的geos几何库,解压到c:\下,双击目录下的autogen.bat,执行后然后使用VS的命令行工具进入到该目录,执行nmake makefile.vc3)拷贝hdf 和HDF5、HDF5SZLIB到C:\4)打开gdal主目录下的nmake.opt修改:# Uncomment for GEOS supportGEOS_DIR=C:\geos-3.0.4GEOS_CFLAGS = -I$(GEOS_DIR)/capi -I$(GEOS_DIR)/source/headers -DHAVE_GEOSGEOS_LIB = $(GEOS_DIR)/source/geos_c_i.lib# Uncomment the following and update to enable NCSA HDF Release 4 support.HDF4_DIR = C:\HDFHDF4_LIB = $(HDF4_DIR)\dll\hd424m.lib $(HDF4_DIR)\dll\hm424m.lib \$(HDF4_DIR)\lib\hd424.lib $(HDF4_DIR)\lib\hm424.lib Ws2_32.lib# Uncomment the following and update to enable NCSA HDF Release 5 support.HDF5_DIR = C:\HDF5SZIP_DIR = C:\HDF5SZLIBHDF5_LIB = $(HDF5_DIR)\dll\hdf5dll.lib $(HDF5_DIR)\dll\hdf5_hldll.lib \$(SZIP_DIR)\dll\szlibdll.lib5)静态链接proj4编译GDAL时,你可以按需要添加其它支持,如ProJ,GeoTiff等等,添加方法只要在nmake.opt找到相关配置节,把前面的“#”去掉,即取消注释,然后修改相关的路径即可。
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格式的文件就是一个数据集,当然其他一些文件格式可能在一个数据集中包含多于一个文件,比如可能除了图像数据文件外还可能会有一些附加信息文件等。
GDAL与OpenCV2.X数据转换(适合多光谱和高光谱等多通道的遥感影像)
GDAL与OpenCV2.X数据转换(适合多光谱和⾼光谱等多通道的遥感影像)⼀、前⾔GDAL具有强⼤的图像读写功能,但是对常⽤图像处理算法的集成较少,OpenCV恰恰具有较强的图像处理能⼒,因此有效的结合两者对图像(遥感影像)的处理带来了极⼤的⽅便。
那么如何实现GDAL与openCV间的数据交换成为影像处理中的关键步骤。
接下来我将记录下:1如何将GDAL读取的影像转化为openCV⽀持的的MAT格式?2 如何将处理后MAT数据转化为合适的图像格式存储?(PS:本⼈也是初次使⽤GDAL和openCV,代码很⽔。
只是记录下⾃⼰学的,和⼤家交流下)⼆、GDAL数据到openCV的MAT格式关于GDAL数据到openCV的格式转化,⽹上已有部分资源,但是⼤多是针对单或者三通道的数据⽽⾔,对多通道图像(遥感的多光谱和⾼光谱影像)的转化不多,话不多说,先上代码:1 cv::Mat GDAL2Mat(const QString fileName)2 {3 GDALAllRegister(); // 注册。
4 GDALDataset *poDataset = (GDALDataset *)GDALOpen(fileName.toStdString().c_str(),GA_ReadOnly);5 int tmpCols = poDataset->GetRasterXSize();6 int tmpRows = poDataset->GetRasterYSize();7 int tmpBandSize = poDataset->GetRasterCount();8 double *tmpadfGeoTransform = new double[6];9 poDataset->GetGeoTransform(tmpadfGeoTransform);1011 QVector <cv::Mat> imgMat; // 每个波段12 float *pafScan = new float[tmpCols*tmpRows]; // 存储数据1314 for(int i = 0;i< tmpBandSize;i++)15 {16 GDALRasterBand *pBand = poDataset->GetRasterBand(i+1);17 //pafScan = new float[tmpCols*tmpRows];18 pBand->RasterIO(GF_Read,0,0,tmpCols,tmpRows,pafScan,19 tmpCols,tmpRows,GDT_Float32,0,0);20 cv::Mat tmpMat = cv::Mat(tmpRows,tmpCols,CV_32FC1,pafScan);21 imgMat.push_back(tmpMat.clone());22 }23 delete []pafScan;24 pafScan = NULL;2526 cv::Mat img;27 img.create(tmpRows,tmpCols,CV_32FC(tmpBandSize));28 cv::merge(imgMat.toStdVector(),img);29 imgMat.clear();30 GDALClose((GDALDatasetH)poDataset);31 return img;32 }思路就是:根据⽂件名获得其GDALDataset数据集,然后分波段(波段相当于通道)存储在格式为Vector<cv::Mat>的容器内,最后利⽤MAT的Merge函数,对通道数据进⾏组合。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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写。