代码示例:
using System;
using OSGeo.GDAL;
namespace GDAL_test
{
class Program
{
static void Main(string[] args)
{
GdalConfiguration.ConfigureGdal();
// 注册所有的驱动
Gdal.AllRegister();
// 打开影像文件
Dataset dataset = Gdal.Open("H:/DEM/DEM12.5.tif", Access.GA_ReadOnly);
if (dataset == null)
{
Console.WriteLine("Failed to open raster dataset.");
return;
}
// 获取影像信息和投影
int width = dataset.RasterXSize;
int height = dataset.RasterYSize;
string projection = dataset.GetProjectionRef();
// 设置瓦片大小
int tileSize = 5000;
//循环
for (int x = 0; x < width; x += tileSize)
{
for (int y = 0; y < height; y += tileSize)
{
// 计算瓦片的行和列
int tileWidth = Math.Min(tileSize, width - x);
int tileHeight = Math.Min(tileSize, height - y);
// 创建瓦片新的栅格数据集
string tileFilename = string.Format("H:/DEM/tile_{0}_{1}.tif", x, y);
Dataset tileDataset = Gdal.GetDriverByName("GTiff").Create(tileFilename, tileWidth, tileHeight, 1, DataType.GDT_Int16, null);
tileDataset.SetProjection(projection);
//设置瓦片的栅数据集的像素坐标与其地理坐标之间的关系
double[] geotransform = new double[6];
dataset.GetGeoTransform(geotransform);
double tileXOrigin = geotransform[0] + x * geotransform[1] + y * geotransform[2];
double tileYOrigin = geotransform[3] + x * geotransform[4] + y * geotransform[5];
geotransform[0] = tileXOrigin;
geotransform[3] = tileYOrigin;
tileDataset.SetGeoTransform(geotransform);
//从瓦片中复制数据集
Band band = dataset.GetRasterBand(1);
int[] data = new int[tileWidth* tileHeight];
band.ReadRaster(x, y, tileWidth, tileHeight, data, tileWidth, tileHeight, 0, 0);
tileDataset.GetRasterBand(1).WriteRaster(0, 0, tileWidth, tileHeight, data, tileWidth, tileHeight, 0, 0);
// 关闭瓦片数据集
tileDataset.FlushCache();
tileDataset.Dispose();
}
}
// 关闭栅格数据集
dataset.Dispose();
}
}
}
GIS展示输出结果:
结论:
输出四个瓦片,且栅格数据存在背景值,其值为-32678。首先按照行列5000输出,剩下就按不足5000输出,以满足要求。
注意:
数据的类型有取值的范围。