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