1

注: APIのバージョンとバージョンを試したので、タグCとタグの両方を追加しました。C++C++C

geotiff車の軌跡に沿って表示するには、ファイルをロードする必要があります。まず、gdal C++API を使用してファイルを開き、そこからいくつかの情報を抽出します。

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" );

ラスターが表示され、ズーム、パンなどができるので、これは機能しているようです。

問題は、同じファイルを一度しか開けないことです。ラスターを 2 つの異なるピックスマップにロードして、最初のピックスマップを軌跡にアタッチし、2 つ目のピックスマップを注釈の作成に使用できるようにする場合、2 つ目のピックスマップは空白でロードされます。

これらのバリエーションを試しましたが、成功しませんでした:

バリエーション 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モードの場合はデータセットを開き、常に を呼び出すようにしましたCloseQtラスターをピックスマップにロードするときに問題が発生する可能性がありますか?

新着:

同じ問題を抱えていた同僚と話をした後gdal、ラスターが適切に閉じられていないようで、API チュートリアルで説明されている動作が強制されるため、問題は の側にあると考えています。引き続き調査していきます…

4

1 に答える 1