6

ac#プロジェクトでgdalを使用する必要があります。私がしなければならないことは、単純なビットマップをGeoTiffに「変換」することです。gdalのWebサイトでいくつかのドキュメントを読みましたが、完全に機能させることができませんでした。実際、私のビットマップはgeotiffに正常にエクスポートされますが、GISソフトウェア(QuantumGISなど)でgeotiffを開くと、GeoTiffはy軸で反転します。

ここに画像の説明を入力してください

元のビットマップは次のようになりますが:

ここに画像の説明を入力してください

これが私がしたことです:

まず、一時ファイル(つまりビットマップ)をディスクに書き込み、gdal関数(Gdal.Open(path))を使用してビットマップを含むデータセットを作成し、(GTiffドライバーを使用して)新しいデータセットを作成します。ビットマップデータセット、ジオ変換を設定し、ジオティフをディスクに書き込みます:

  String wktProj = null;
  String tmpPath = @"C:\tmp.bmp";
  Bitmap tmpBitmap = bmp.Clone(new Rectangle(0, 0, bmp.Width, bmp.Height), pixFormat);
  tmpBitmap.Save(tmpPath, ImageFormat.Bmp);

  String[] options = null;
  Gdal.AllRegister();
  OSGeo.GDAL.Driver srcDrv = Gdal.GetDriverByName("GTiff");
  Dataset srcDs = Gdal.Open(tmpPath, Access.GA_ReadOnly);
  Dataset dstDs = srcDrv.CreateCopy(path, srcDs, 0, options, null, null);

  //Set the map projection
  Osr.GetWellKnownGeogCSAsWKT("WGS84", out wktProj);
  dstDs.SetProjection(wktProj);

  //Set the map georeferencing
  double mapWidth = Math.Abs(latLongMap.listBounds.topRight.x - latLongMap.listBounds.bottomLeft.x);
  double mapHeight = Math.Abs(latLongMap.listBounds.topRight.y - latLongMap.listBounds.bottomLeft.y);
  double[] geoTransfo = new double[] { -5.14, mapWidth / bmp.Width, 0, 48.75, 0, mapHeight / bmp.Height };
  dstDs.SetGeoTransform(geoTransfo);

  dstDs.FlushCache();
  dstDs.Dispose();
  srcDs.Dispose();
  srcDrv.Dispose();
  tmpBitmap.Dispose();

  File.Delete(tmpPath);

私が間違っていることについて何か考えはありますか?

編集それが重要かどうかはわかりませんが、ピクセルビットマップは8bppIndexedです。

4

1 に答える 1

5

問題を解決するために、私はこの行を置き換えます:

double[] geoTransfo = new double[] { -5.14, mapWidth / bmp.Width, 0, 48.75, 0, mapHeight / bmp.Height };

これで:

double[] geoTransfo = new double[] { -5.14, mapWidth / bmp.Width, 0, 48.75, 0, (mapHeight / bmp.Height)*(-1) };

ピクセルサイズ(高さ)は負でなければならないようです。

于 2012-11-05T11:01:50.373 に答える