Qt5.0调用GDAL库函数

关于在Qt5.0中使用GDAL库和函数调用的总结

 

添加库函数的方式可以参考5.0的帮助文档的关于LIBS的部分只要添加了路径就可以了。正如如下的文章所描述的:http://m.blog.csdn.net/blog/u010741715/12649225

 

如果在工程中直接添加的话右击工程文件选择添加库外部库默认在当前的工程目录下添加,添加后的代码如下:

win32: LIBS += -L$$PWD/GDAL/lib/ -lgdal_i

INCLUDEPATH += $$PWD/GDAL/include

DEPENDPATH += $$PWD/GDAL/include

L表示路径,l表示库。

1.但是添加完库函数后有的库函数并不能直接调用到目前为止获得的原因是:

gdal_priv.h文件中定义的某些类的函数,并没有声明其其在动态链接库中的地址所以利用对象直接引用该函数会造成找不到该函数的定义的错误,这个错误真是好难发现呀!刚开始真是百思不得其解。gdal_priv.h中的GDALDataset

定义如下:

class CPL_DLL GDALDataset : public GDALMajorObject

{

…..

 public:

    virtual     ~GDALDataset();

 

    int         GetRasterXSize( void );

    int         GetRasterYSize( void );

    int         GetRasterCount( void );//gdal.h中 加了GDAL前缀

…..

}

其类的CPL_DLL未起作用不知其中原因,留作以后再说吧。

 

2.但是有些gdal_priv.h中的头文件中定义的函数能够正常调用而且gdal.h文件中能够找到类似

int CPL_DLL CPL_STDCALL     GDALGetRasterXSize( GDALDatasetH );

int CPL_DLL CPL_STDCALL     GDALGetRasterYSize( GDALDatasetH );

int CPL_DLL CPL_STDCALL     GDALGetRasterCount( GDALDatasetH );

的定义声明 可以大概推测CPL_DLL CPL_STDCALL就是对应的gdal19.dll库中的动态地址声明部分。

所以在主函数调用的时候直接调用这些函数就可以了:

CPLErr CPL_DLL  CPL_STDCALL GDALAddBand( GDALDatasetH hDS, GDALDataType eType, char **papszOptions );

注意添加一个参数就可以了即:

GDALDatasetH 调用者的指针!

结果程序能顺利的跑起来本人表示非常开心!

Main()

{

 fileName=QFileDialog::getOpenFileName(&w,

                                          QObject::tr(打开),

                                          QDir::currentPath());

 

    QMessageBox::about( &w, QObject::tr( “fileName!” ), QObject::tr( “open file %1” ).arg( fileName ));

 

    QByteArray ba=fileName.toStdString().c_str();

    QMessageBox::about( &w, QObject::tr( “ba!” ), QString( “open file %1” ).arg( ba.data() ) );

  GDALAllRegister();

 //   OGRAllRegister();

 //   CPLSetConfigOption(“GDAL_FILENAME_IS_UTF8″,”NO”);  //中文路径此句在此不用加Qt5.0,UTF-8支持中文路径

    GDALDataset *poDataset;

    poDataset = (GDALDataset*)GDALOpen( ba.data(), GA_ReadOnly );

    int x;

    x=GDALGetRasterCount(poDataset);

    QMessageBox::about( &w, QObject::tr( “count” ), QObject::tr( 包含的数据集的个数也就是波段数%1″ ).arg(x));

    int xsize;

    xsize=GDALGetRasterXSize(poDataset);

    int ysize;

    ysize=GDALGetRasterYSize(poDataset);

 

    QMessageBox::about( &w, QObject::tr( “Xsize and Ysize” ), QObject::tr( 图像的Xsize%1;图像的Ysize%2″ ).arg(xsize).arg(ysize));

 

}

转载自:https://blog.csdn.net/zhangziyuanwww/article/details/48268121

You may also like...