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

Мне нужно использовать gdal в проекте C #. Мне нужно «преобразовать» простое растровое изображение в GeoTiff. Я прочитал некоторую документацию на сайте gdal, но мне не удалось заставить ее работать идеально. Фактически, мое растровое изображение успешно экспортируется в геотиф, но если я открываю геотиф с помощью программного обеспечения ГИС (например, QuantumGIS), 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.


person Ashbay    schedule 31.10.2012    source источник
comment
Какой класс вы использовали для latLongMap? Спасибо.   -  person Ivo Pavlik    schedule 17.07.2015


Ответы (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) };

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

person Ashbay    schedule 05.11.2012
comment
Наверное, это уже очевидно, но координаты изображения начинаются в верхнем левом углу (увеличение значений y указывает на следующую строку данных пикселей), тогда как геоизображение начинается в нижнем левом углу. - person Erik Vullings; 27.01.2014
comment
@ErikVullings Вы совершенно правы. Я забыл обновить свой ответ этой информацией. Так что спасибо, что указали на это;) - person Ashbay; 30.01.2014