1

注意:我添加了CC++标签,因为我尝试了 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 教程中解释的行为。我会继续调查...

4

1 回答 1

0

注意:这是暂时的,并不令人满意。我仍在寻找更好的解决方案。因此,如果有人知道方法,请发布答案,我将不胜感激地接受并投票。

我现在使用的解决方案是在需要检查另一个光栅时关闭光栅。我们的应用程序有一个树形小部件,它显示我们打开了多少项目(及其类型)。因此,当我们选择链接到轨迹的栅格时,如果它已加载,我们只需将其关闭(就像在这种情况下,我们需要将其打开两次)并重新打开它。

然后,当我们需要单独处理栅格时,我们必须在链接节点中将其关闭并在I'm allalone here节点中重新打开它。

一个真正的痛苦。

于 2014-01-21T10:00:13.160 回答