注意:我添加了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
我已打开数据集 ifREAD_ONLY
模式并确保始终调用Close
. Qt
那么当它将光栅加载到像素图中时,问题可能就在一边吗?
新的:
在与遇到同样问题的同事交谈后,我们认为问题出在 的一侧gdal
,因为光栅似乎没有正确关闭,这迫使 API 教程中解释的行为。我会继续调查...