感谢这篇文章c# - 使用 gdal 从 C# 中的现有位图创建 geotiff - IT工具网 (coder.work)
下载tif为cgcs2000,坐标信息未写入文件头,creatGeotiff函数实现tiff文件头写入投影信息。
tiffpath-原始tif路径;X1,Y1,左上角坐标;resolution 影像分辨率;savetiffpath geotif保存路径
private void CreatGeoTiff(string TifFilePath,double X1,double Y1,double Resolution,string SaveTifPath)
{
string WktProj = null;
//原始数据
Bitmap bmp = new Bitmap(TifFilePath);
Bitmap tmpBitmap = bmp.Clone(new Rectangle(0, 0, bmp.Width, bmp.Height),System.Drawing.Imaging.PixelFormat.Format24bppRgb);
string GeoPrj= "GEOGCS[\"GCS_China_Geodetic_Coordinate_System_2000\",DATUM[\"D_China_2000\",SPHEROID[\"CGCS2000\",6378137.0,298.257222101]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]]";
Gdal.AllRegister();
//调用 GeoTiff引擎
OSGeo.GDAL.Driver TifDrv = Gdal.GetDriverByName("GTiff");
//打开原始tiff图片
OSGeo.GDAL.Dataset srcDs = Gdal.Open(TifFilePath, Access.GA_ReadOnly);
//写入新tiff
OSGeo.GDAL.Dataset destDs = TifDrv.CreateCopy(SaveTifPath, srcDs, 0, null, null, null);
Osr.GetWellKnownGeogCSAsWKT("EPSG:4490", out WktProj);
//destDs.SetProjection(GeoPrj);
destDs.SetProjection( WktProj);
//arg[0]:左上角像素经度
// arg[1]:影像宽度方向上的分辨率(经度范围 / 像素个数)
//arg[2] 旋转, 0表示上面为北方
//arg[3]:左上角像素纬度
//arg[4]:旋转, 0表示上面为北方
//arg[5]:影像宽度方向上的分辨率(纬度范围 / 像素个数)-tfw文件中的那个分辨率负值
double[] geoTransform = new double[] { X1, Resolution, 0, Y1, 0,Resolution*(-1)};
destDs.SetGeoTransform(geoTransform);
destDs.FlushCache();
destDs.Dispose();
srcDs.Dispose();
TifDrv.Dispose();
tmpBitmap.Dispose();
}