使用 gdal 和 qt 打开相同的 tif 两次显示空白
Opening the same tif twice with gdal and qt shows it blank
注意:自从我尝试使用C++
版本和C
版本的API以来,我添加了C
和C++
标签。
我必须加载一个geotiff
文件才能沿汽车轨迹显示它。首先,我使用 API 打开文件gdal C++
从中提取一些信息:
double geo_transform[6];
GDALDataset* data = (GDALDataset*) GDALOpenShared( "MyRaster.tif", GA_ReadOnly );
if(data) {
size[0] = data->GetRasterXSize();
size[1] = data->GetRasterYSize();
qDebug() << "RASTER TOTAL BANDS:" << data->GetRasterCount();
if( CE_None == data->GetGeoTransform( geo_transform ) ) {
qDebug() << "RASTER TL:" << geo_transform[0] << geo_transform[3];
qDebug() << "RASTER SIZE:" << size[0] << size[1];
qDebug() << "RASTER ROTATIONS:" << geo_transform[2] << geo_transform[4];
qDebug() << "PIXEL SIZE:" << geo_transform[1] << geo_transform[5];
toret = true;
}
/*
* Retrieve the pixel size and top left corner and store it in a proper variable.
*/
GDALClose(data);
然后,在不同的线程(通过QThread
启动)中,我将图像"加载"到QPixmap
(这是我加载栅格的类的变量。在构造函数中,它被初始化为空的像素图):
temp_pixmap.load( "MyRaster.tif" );
这似乎有效,因为显示了光栅,我可以缩放它、平移它等。
问题是我只能打开同一个文件一次。如果我想将栅格加载到两个不同的像素图中,那么第一个可以附加到轨迹,第二个可用于进行注释,第二个以空白加载。
我尝试了这些变体,但没有成功:
变体 1:将 GDALDataSource
指针作为类的变量并在析构函数中调用GDALClose
。
变化 2:我没有用GDALOpen
打开栅格,而是用GDALOpenShared
尝试了一下,然后在析构函数中关闭了它。
变化 3:使用 C
版本:
GDALDatasetH hDataset;
hDataset = GDALOpen( Element::getFilePath().c_str(), GA_ReadOnly );
if( hDataset != NULL ) {
GDALDriverH hDriver;
hDriver = GDALGetDatasetDriver( hDataset );
if( GDALGetGeoTransform( hDataset, geo_transform ) == CE_None ) {
// Get the size and top left corner...
}
}
GDALClose(hDataset);
在 API 教程的关闭数据集部分中,有以下内容:
Forgetting to call GDALClose on a dataset opened in update mode in a popular format like GTiff will likely result in being unable to open it afterwards
如果READ_ONLY
模式,我已经打开了数据集,并确保始终调用Close
。那么,当它将栅格加载到像素图中时,问题是否出在Qt
端?
新增功能:
在与遇到相同问题的同事交谈后,我们认为问题出在gdal
方面,因为栅格似乎没有正确关闭,这迫使 API 教程中解释的行为。我会继续调查...
注意:这是暂时的,并不令人满意。我仍在寻找更好的解决方案。因此,如果有人知道一种方法,请发布答案,我将感激地接受并投赞成票。
我现在使用的解决方案是在需要检查另一个栅格时关闭栅格。我们的应用程序有一个树小部件,显示我们打开了多少项目(及其类型)。因此,当我们选择链接到轨迹的栅格时,只需在加载时将其关闭(例如在本例中,我们需要将其打开两次)并重新打开即可。
然后,当我们需要单独处理栅格时,我们必须在链接节点中关闭它,然后在我独自一人在这里节点中重新打开它。
真的很痛苦。
- g++的分段错误(在NaN上使用to_string两次时)
- 蛇在C++不会连续转两次
- 检查一个数组是否包含在另一个数组中,以相反的顺序,至少两次
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 我应该如何去缓解两次出现的cin?
- Realloc 两次无法在 Visual Studio 上运行
- 使用 getline(cin, var) 两次在进行字符串比较时会产生错误 (==)
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- C++析构函数调用两次,堆栈分配的复合对象
- 为什么参数在构造 std::thread 时移动两次
- Qt插槽调用了两次
- 做 std::用相同的unique_ptr移动两次
- C++两次定义相同的函数会导致错误
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- 对于优化级别为 0 的 std::vector,析构函数被调用两次
- 使用柯南打包时如何避免列出两次依赖?
- 为什么要执行两次位移((x >> 4)<< 4)?
- 对结构向量进行两次排序
- 如果我使用同一个密钥推送用户数据两次,会发生什么
- 使用 gdal 和 qt 打开相同的 tif 两次显示空白