Создайте geotiff из существующего растрового изображения в C# с помощью gdal

Я должен использовать gdal в проекте c#. Что мне нужно сделать, чтобы "конвертировать" простое растровое изображение в формате GeoTIFF. Я прочитал некоторую документацию на веб-сайте gdal, но мне не удалось заставить ее работать отлично. На самом деле мое растровое изображение успешно экспортируется в geotiff, но если я открываю geotiff с помощью программного обеспечения ГИС (например, QuantumGIS), GeoTiff инвертируется по оси y :

enter image description here :

в то время как исходное растровое изображение выглядеть так :

enter image description here

вот что я сделал :

сначала я пишу временный файл на диск (это растровое изображение), я создаю набор данных, содержащий растровое изображение благодаря функции gdal (Gdal.Open (path)), и я создаю новый набор данных (с драйвером GTiff), используя набор растровых данных, я устанавливаю преобразование geo и пишу geotiff на диск :

  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.

1 ответов


чтобы решить проблему, я заменяю эту строку:

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

похоже, что размер пикселя (высота) должен быть отрицательным.