我必须在c#项目中使用gdal。我要做的是将一个简单的位图“转换”为GeoTiff。我在gdal网站上阅读了一些文档,但是我没有成功完成它。实际上我的位图已成功导出到地理位置,但如果我使用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。
答案 0 :(得分: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) };
看起来像素大小(高度)必须是负数。