GDAL GDALOpen与Open 返回值 强制转换

开头

GDALDataset*poDataset=(GDALDataset*)GDALOpen("test.tif",GA_ReadOnly);

(GDALDataset*)是必要的吗    首先我们先深入了解下GDALOpen

GDALOpen

GDALDatasetH GDALOpenconst 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);  //这样当然是安全的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

场主不吃鍋巴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值