开头
GDALDataset*poDataset=(GDALDataset*)GDALOpen("test.tif",GA_ReadOnly);
(GDALDataset*)是必要的吗 首先我们先深入了解下GDALOpen
GDALOpen
GDALDatasetH GDALOpen(const char *pszFilename, GDALAccess eAccess)
将栅格文件作为 GDALDataset 打开
参数:
psz文件名 ― 要访问的文件的名称。对于外来驱动程序,这可能不是指物理文件,而是包含驱动程序有关如何访问数据集的信息。它应该采用 UTF-8 编码。
访问模式 – 所需的访问,GA_Update或GA_ReadOnly。许多驱动程序仅支持只读访问。
返回:失败时的 GDALDatasetH 句柄或 NULL。对于C++应用程序,此句柄可以强制转换为 GDALDataset *
注意:
- 如果打开具有GA_Update访问权限的数据集对象,则不建议在同一基础文件上打开新数据集
原因:如果打开具有 GA_Update 访问权限的数据集对象,则意味着您可以对原始数据进行更新或修改。如果您在同一基础文件上打开新数据集,可能会导致数据冲突或损坏
- 返回的数据集一次只能由一个线程访问。如果要从不同的线程使用它,则必须添加所有必要的代码(互斥锁等)以避免并发使用该对象。(某些驱动程序(如 GeoTIFF)维护内部状态变量,这些变量在每次读取新块时都会更新,从而防止并发使用
原因:数据集对象是一个内存块,用于存储二进制数据。由于数据集对象是共享的,因此多个线程可以同时访问它。然而,如果多个线程同时访问数据集对象,则可能会导致数据丢失、损坏或不一致
OPEN
Open是一个GDALDriver类方法,所以可以使用 GDALDriver 对象来打开数字影像文件
参数:
psz文件名 ― 要访问的文件的名称。对于外来驱动程序,这可能不是指物理文件,而是包含驱动程序有关如何访问数据集的信息。它应该采用 UTF-8 编码。
访问模式 – 所需的访问,GA_Update或GA_ReadOnly。许多驱动程序仅支持只读访问。
返回值:一个指向GDALDataset类型的指针 失败 NULL
GDALDriver *driver = GDALGetDriverByName("GTiff");
driver->Open("filename", GA_ReadOnly);
测试代码
#include "gdal_priv.h"
#include<iostream>
using namespace std;
int main()
{
const char* pszFile;
GDALAllRegister();
pszFile = "1.jpeg"; //路径改成自己的
GDALDataset *poDataset = GDALOpen(pszFile, GA_ReadOnly);
//正确GDALDataset *poDataset = (GDALDataset*)GDALOpen(pszFile, GA_ReadOnly);
GDALRasterBand *poBand = poDataset->GetRasterBand(1);
int xsize = poBand->GetXSize();
int ysize = poBand->GetYSize();
cout << xsize << endl;
cout << ysize << endl;
system("pause");
return 0;
}
error: invalid conversion from ‘GDALDatasetH’ {aka ‘void*’} to ‘GDALDataset*’ [-fpermissive]
9 | GDALDataset *poDataset = GDALOpen(pszFile, GA_ReadOnly);
| ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
| |
| GDALDatasetH {aka void*}
结论
报错了, 证明(GDALDataset*)是必要的。
GDALOpen函数的返回值是一个 GDALDatasetH
类型的句柄。这个句柄可以用来访问数据集的属性和内容
(GDALDataset*)是将GDALDatasetH转换为GDALDataset类型的指针,来保证两边的类型相等
GDALDatasetH hDataset = GDALOpen("input.tif", GDAL_OF_RASTER); //这样当然是安全的