1栅格累加
所谓栅格累加就是把一个文件夹里选中的栅格依次相加,相当于之前两个栅格相加的升级版。
public List<IRasterDataset> OpenTiffFiles()
{
// 创建一个打开文件对话框
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "TIFF 文件 (*.tif)|*.tif";
openFileDialog.Title = "选择要打开的TIFF 文件";
openFileDialog.Multiselect = true; // 允许多选文件
List<IRasterDataset> rasterDatasets = new List<IRasterDataset>();
// 如果用户点击了"确定"按钮
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
// 遍历用户选择的所有文件
foreach (string tiffPath in openFileDialog.FileNames)
{
// 使用工作空间工厂打开 TIFF 文件
IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactory();
string directory = System.IO.Path.GetDirectoryName(tiffPath);
string fileName = System.IO.Path.GetFileName(tiffPath);
IRasterWorkspace rasterWorkspace = workspaceFactory.OpenFromFile(directory, 0) as IRasterWorkspace;
// 使用工作空间打开栅格数据集
IRasterDataset rasterDataset = rasterWorkspace.OpenRasterDataset(fileName);
if (rasterDataset != null)
{
// 将栅格数据集添加到列表中
rasterDatasets.Add(rasterDataset);
}
}
}
return rasterDatasets; // 返回选择的栅格数据集列表
}
private IRaster SumRasterDatasets(List<IRasterDataset> rasterDatasets)
{
if (rasterDatasets.Count == 0)
{
return null;
}
// 获取第一个栅格数据集作为基础进行相加
IRasterDataset baseDataset = rasterDatasets[0];
IMapAlgebraOp pMapAlgebraOp = new RasterMapAlgebraOpClass();
IRasterAnalysisEnvironment pEnv = (IRasterAnalysisEnvironment)pMapAlgebraOp;
pEnv.OutWorkspace = new RasterWorkspaceFactory().OpenFromFile(System.IO.Path.GetDirectoryName(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)), 0);
IGeoDataset baseDataset1 = baseDataset as IGeoDataset;
// 绑定栅格数据
pMapAlgebraOp.BindRaster(baseDataset1, "Ras01");
// 从第二个栅格数据集开始进行相加
for (int i = 1; i < rasterDatasets.Count; i++)
{
IRasterDataset currentDataset = rasterDatasets[i];
pMapAlgebraOp.BindRaster((IGeoDataset)currentDataset, "Ras02");
// 设置地图代数表达式
string sOut = "[Ras01] " + "+ " + "[Ras02] ";
// 创建栅格运算对象
result = pMapAlgebraOp.Execute(sOut);
// 如果栅格相加操作失败,则返回null
if (result == null)
{
return null;
}
// 将结果更新为新的基础栅格数据集,以便进行下一轮相加
baseDataset1 = result;
}
return (IRaster)baseDataset1; // 返回相加后的栅格数据集
}
private void 多栅格累加ToolStripMenuItem_Click(object sender, EventArgs e)
{
// 用户选择的多个TIFF文件
List<IRasterDataset> rasterDatasets = OpenTiffFiles();
if (rasterDatasets == null)
{
MessageBox.Show("未选择任何TIFF文件或者打开文件失败。");
return;
}
IRaster resultDataset1 = null;
if (rasterDatasets.Count > 0)
{
// 执行栅格相加操作
resultDataset1 = SumRasterDatasets(rasterDatasets);
// 这里可以处理resultDataset,例如显示或保存
MessageBox.Show("TIFF 文件相加完成。");
}
else
{
MessageBox.Show("未选择任何TIFF文件。");
}
IRasterLayer rasterLayer = new RasterLayerClass();
rasterLayer.CreateFromRaster(resultDataset1);
rasterLayer.Name = "累加";
axMapControl2.AddLayer((ILayer)rasterLayer, 0);
axMapControl2.ActiveView.Refresh();
if (resultDataset1 != null)
{
SaveRasterToFile(resultDataset1);
}
}
2 栅格累乘操作
private IRaster MultiplyRasterDatasets(List<IRasterDataset> rasterDatasets)
{
if (rasterDatasets.Count == 0)
{
return null;
}
// 获取第一个栅格数据集作为基础进行相加
IRasterDataset baseDataset = rasterDatasets[0];
IMapAlgebraOp pMapAlgebraOp = new RasterMapAlgebraOpClass();
IRasterAnalysisEnvironment pEnv = (IRasterAnalysisEnvironment)pMapAlgebraOp;
pEnv.OutWorkspace = new RasterWorkspaceFactory().OpenFromFile(System.IO.Path.GetDirectoryName(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)), 0);
IGeoDataset baseDataset1 = baseDataset as IGeoDataset;
// 绑定栅格数据
pMapAlgebraOp.BindRaster(baseDataset1, "Ras01");
// 从第二个栅格数据集开始进行相加
for (int i = 1; i < rasterDatasets.Count; i++)
{
IRasterDataset currentDataset = rasterDatasets[i];
pMapAlgebraOp.BindRaster((IGeoDataset)currentDataset, "Ras02");
// 设置地图代数表达式
string sOut = "[Ras01] " + "* " + "[Ras02] ";
// 创建栅格运算对象
result = pMapAlgebraOp.Execute(sOut);
// 如果栅格相加操作失败,则返回null
if (result == null)
{
return null;
}
// 将结果更新为新的基础栅格数据集,以便进行下一轮相加
baseDataset1 = result;
}
return (IRaster)baseDataset1; // 返回相加后的栅格数据集
}
private void 多栅格累乘ToolStripMenuItem_Click(object sender, EventArgs e)
{
// 用户选择的多个TIFF文件
List<IRasterDataset> rasterDatasets = OpenTiffFiles();
if (rasterDatasets == null)
{
MessageBox.Show("未选择任何TIFF文件或者打开文件失败。");
return;
}
IRaster resultDataset1 = null;
if (rasterDatasets.Count > 0)
{
// 执行栅格相加操作
resultDataset1 = MultiplyRasterDatasets(rasterDatasets);
// 这里可以处理resultDataset,例如显示或保存
MessageBox.Show("TIFF 文件相乘完成。");
}
else
{
MessageBox.Show("未选择任何TIFF文件。");
}
IRasterLayer rasterLayer = new RasterLayerClass();
rasterLayer.CreateFromRaster(resultDataset1);
rasterLayer.Name = "累乘";
axMapControl2.AddLayer((ILayer)rasterLayer, 0);
axMapControl2.ActiveView.Refresh();
if (resultDataset1 != null)
{
SaveRasterToFile(resultDataset1);
}
}