示例代码:
using System;
using OSGeo.GDAL;
namespace GDAL_test
{
class Program
{
static void Main(string[] args)
{
GdalConfiguration.ConfigureGdal();
// 注册所有的驱动
Gdal.AllRegister();
//打开输入数据集
Dataset inputDataset1 = Gdal.Open("H:/DEM/test1.tif", Access.GA_ReadOnly);
Dataset inputDataset2 = Gdal.Open("H:/DEM/test2.tif", Access.GA_ReadOnly);
// 获取栅格大小
int xSize = inputDataset1.RasterXSize + inputDataset2.RasterXSize;
int ySize = Math.Max(inputDataset1.RasterYSize, inputDataset2.RasterYSize);
int bandCount = inputDataset1.RasterCount;
//int dataType = (int)inputDataset1.GetRasterBand(1).DataType;
//创建输出数据集
Driver driver = Gdal.GetDriverByName("GTiff");
Dataset outputDataset = driver.Create("H:/DEM/output.tif", xSize, ySize, bandCount, DataType.GDT_Int16, null);
//设置输出数据集的投影和地理变换
string projection = inputDataset1.GetProjectionRef();
outputDataset.SetProjection(projection);
double[] geoTransform = new double[6];
inputDataset1.GetGeoTransform(geoTransform);
outputDataset.SetGeoTransform(geoTransform);
//将数据从输入数据集复制到输出数据集
for (int i = 1; i <= bandCount; i++)
{
Band inputBand1 = inputDataset1.GetRasterBand(i);
Band outputBand = outputDataset.GetRasterBand(i);
int[] buffer = new int[inputDataset1.RasterXSize];
for (int j = 0; j < inputDataset1.RasterYSize; j++)
{
//从第一个输入数据集中复制数据
inputBand1.ReadRaster(0, j, inputDataset1.RasterXSize, 1, buffer, inputDataset1.RasterXSize, 1, 0, 0);
outputBand.WriteRaster(0, j, inputDataset1.RasterXSize, 1, buffer, inputDataset1.RasterXSize, 1, 0, 0);
}
}
for (int i = 1; i <= bandCount; i++)
{
//从第二个输入数据集中复制数据
Band inputBand2 = inputDataset2.GetRasterBand(i);
Band outputBand = outputDataset.GetRasterBand(i);
int[] buffer = new int[inputDataset2.RasterXSize];
for (int j = 0; j < inputDataset2.RasterYSize; j++)
{
inputBand2.ReadRaster(0, j, inputDataset2.RasterXSize, 1, buffer, inputDataset2.RasterXSize, 1, 0, 0);
outputBand.WriteRaster(inputDataset1.RasterXSize, j, inputDataset2.RasterXSize, 1, buffer, inputDataset2.RasterXSize, 1, 0, 0);
}
}
}
}
}
GIS结果展示:
说明:首先要承认自己写这部分的代码是不太好的。有些细节没有考虑,我是用两个横排的数据进行镶嵌,如果换成两个竖排数据,那代码还要重新修改,没有做到一力破万法。
可参考的代码片段也就是设置输出数据集的投影和地理变换以及将数据从输入数据集复制到输出数据集。