1栅格计算器
0先要加载一下用于计算的接口Imathop
public Form3()
{
IAoInitialize m_aoinitialize = new AoInitializeClass();
m_aoinitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeEngine);
InitializeComponent();
}
private IGeoDataset inGeodataset1;//输入数据1
private IGeoDataset inGeodataset2;//输入数据2
private IGeoDataset result;//返回结果
private IMathOp mathOp;//数学计算对象
private void Form3_Load(object sender, EventArgs e)
{
mathOp = new RasterMathOpsClass();
}
1输入栅格数据,这次对输入栅格的代码做了封装
// 封装打开TIFF文件的函数
public IRasterDataset OpenTiffFile()
{
// 创建一个打开文件对话框
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "TIFF 文件 (*.tif)|*.tif";
openFileDialog.Title = "选择要打开的TIFF 文件";
// 如果用户点击了"确定"按钮
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
// 获取用户选择的文件路径
string tiffPath = openFileDialog.FileName;
// 使用工作空间工厂打开 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);
// 使用工作空间打开栅格数据集并返回
return rasterDataset;
}
return null; // 如果用户未选择文件,则返回null
}
当点击输入时,就会把栅格加载进第一个mapControl
private void 输入tif数据ToolStripMenuItem_Click(object sender, EventArgs e)
{
IRasterDataset rasterDataset = OpenTiffFile();
IRasterLayer rasterLayer = new RasterLayerClass();
rasterLayer.CreateFromDataset(rasterDataset);
// 将栅格图层添加到地图控件中
axMapControl1.AddLayer(rasterLayer);
// 刷新地图控件
axMapControl1.Refresh();
}
2选择栅格,有两个combobox,负责根据图层名称选择图层
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
ILayer layer = getLayerFromName(comboBox1.SelectedItem.ToString());
IRasterLayer rasterLayer = layer as IRasterLayer;
IRaster raster = rasterLayer.Raster;
inGeodataset1 = raster as IGeoDataset;
}
catch
{
MessageBox.Show("请输入栅格数据!");
};
}
private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
ILayer layer = getLayerFromName(comboBox2.SelectedItem.ToString());
IRasterLayer rasterLayer = layer as IRasterLayer;
IRaster raster = rasterLayer.Raster;
inGeodataset2 = raster as IGeoDataset;
}
catch
{
MessageBox.Show("请输入栅格数据!");
};
}
//通过图层名得到图层
private ILayer getLayerFromName(string layerName)
{
ILayer layer;
IMap map = axMapControl1.Map;
for (int i = 0; i < map.LayerCount; i++)
{
layer = map.get_Layer(i);
if (layerName == layer.Name)
return layer;
}
return null;
}
3加减乘除操作
private void 加ToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
if (comboBox1.SelectedItem == null || comboBox2.SelectedItem == null)
return;
result = mathOp.Plus(inGeodataset1, inGeodataset2);
ShowResult(result, "Plus");
}
catch { }
}
private void 减ToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
if (comboBox1.SelectedItem == null || comboBox2.SelectedItem == null)
return;
result = mathOp.Minus(inGeodataset1, inGeodataset2);
ShowResult(result, "Minus");
}
catch { }
}
private void 乘ToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
if (comboBox1.SelectedItem == null || comboBox2.SelectedItem == null)
return;
result = mathOp.Times(inGeodataset1, inGeodataset2);
ShowResult(result, "Times");
}
catch { }
}
private void 除ToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
if (comboBox1.SelectedItem == null || comboBox2.SelectedItem == null)
return;
result = mathOp.Divide(inGeodataset1, inGeodataset2);
ShowResult(result, "Divide");
}
catch { }
}
//显示栅格结果
private void ShowResult(IGeoDataset geoDataset, string interType)
{
IRasterLayer rasterLayer = new RasterLayerClass();
IRaster raster = new Raster();
raster = (IRaster)geoDataset;
rasterLayer.CreateFromRaster(raster);
rasterLayer.Name = interType;
axMapControl2.AddLayer((ILayer)rasterLayer, 0);
axMapControl2.ActiveView.Refresh();
}
4指数运算(同理可实现对数运算)
private IRaster MapAlgebraOperationEXP(IRasterDataset rasterDataset)
{
IMapAlgebraOp pMapAlgebraOp = new RasterMapAlgebraOpClass();
IRasterAnalysisEnvironment pEnv = (IRasterAnalysisEnvironment)pMapAlgebraOp;
pEnv.OutWorkspace = new RasterWorkspaceFactory().OpenFromFile(System.IO.Path.GetDirectoryName(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)), 0);
pMapAlgebraOp.BindRaster((IGeoDataset)rasterDataset, "Ras01");
string sOut = "Exp([Ras01])";
return (IRaster)pMapAlgebraOp.Execute(sOut);
}
private void SaveRasterToFile(IRaster raster)
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Title = "保存为";
saveFileDialog.Filter = "TIFF 文件 (*.tif)|*.tif|所有文件 (*.*)|*.*";
saveFileDialog.FilterIndex = 1;
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
string saveFileName = saveFileDialog.FileName;
ISaveAs2 pSaveAs = (ISaveAs2)raster;
pSaveAs.SaveAs(saveFileName, new RasterWorkspaceFactory().OpenFromFile(System.IO.Path.GetDirectoryName(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)), 0), "TIFF");
}
}
private void 指数运算ToolStripMenuItem_Click(object sender, EventArgs e)
{
IRasterDataset rasterDataset = OpenTiffFile();
IRaster processedRaster = MapAlgebraOperationEXP(rasterDataset);
IRasterLayer rasterLayer = new RasterLayerClass();
rasterLayer.CreateFromRaster(processedRaster);
rasterLayer.Name = "EXP";
axMapControl2.AddLayer((ILayer)rasterLayer, 0);
axMapControl2.ActiveView.Refresh();
SaveRasterToFile(processedRaster);
}
5栅格加常数
private IRaster MapAlgebraOperationPLUS(IRasterDataset rasterDataset)
{
IMapAlgebraOp pMapAlgebraOp = new RasterMapAlgebraOpClass();
IRasterAnalysisEnvironment pEnv = (IRasterAnalysisEnvironment)pMapAlgebraOp;
pEnv.OutWorkspace = new RasterWorkspaceFactory().OpenFromFile(System.IO.Path.GetDirectoryName(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)), 0);
// 绑定栅格数据
pMapAlgebraOp.BindRaster((IGeoDataset)rasterDataset, "Ras01");
string pValue = Microsoft.VisualBasic.Interaction.InputBox("请输入要添加的常数:", "输入常数", "0");
// 设置地图代数表达式
string sOut = "[Ras01] " + "+ " + pValue;
return (IRaster)pMapAlgebraOp.Execute(sOut);
}
private void SaveRasterToFile(IRaster raster)
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Title = "保存为";
saveFileDialog.Filter = "TIFF 文件 (*.tif)|*.tif|所有文件 (*.*)|*.*";
saveFileDialog.FilterIndex = 1;
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
string saveFileName = saveFileDialog.FileName;
ISaveAs2 pSaveAs = (ISaveAs2)raster;
pSaveAs.SaveAs(saveFileName, new RasterWorkspaceFactory().OpenFromFile(System.IO.Path.GetDirectoryName(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)), 0), "TIFF");
}
}
private void 栅格加减常数ToolStripMenuItem_Click(object sender, EventArgs e)
{
IRasterDataset rasterDataset = OpenTiffFile();
IRaster processedRaster = MapAlgebraOperationPLUS(rasterDataset);
IRasterLayer rasterLayer = new RasterLayerClass();
rasterLayer.CreateFromRaster(processedRaster);
rasterLayer.Name = "PLUS";
axMapControl2.AddLayer((ILayer)rasterLayer, 0);
axMapControl2.ActiveView.Refresh();
SaveRasterToFile(processedRaster);
}
6栅格乘常数(除常数同理)
private IRaster MapAlgebraOperationMULTIPLY(IRasterDataset rasterDataset)
{
IMapAlgebraOp pMapAlgebraOp = new RasterMapAlgebraOpClass();
IRasterAnalysisEnvironment pEnv = (IRasterAnalysisEnvironment)pMapAlgebraOp;
pEnv.OutWorkspace = new RasterWorkspaceFactory().OpenFromFile(System.IO.Path.GetDirectoryName(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)), 0);
// 绑定栅格数据
pMapAlgebraOp.BindRaster((IGeoDataset)rasterDataset, "Ras01");
string pValue = Microsoft.VisualBasic.Interaction.InputBox("请输入要添加的常数:", "输入常数", "0");
// 设置地图代数表达式
string sOut = "[Ras01] " + "*" + pValue;
return (IRaster)pMapAlgebraOp.Execute(sOut);
}
private void SaveRasterToFile(IRaster raster)
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Title = "保存为";
saveFileDialog.Filter = "TIFF 文件 (*.tif)|*.tif|所有文件 (*.*)|*.*";
saveFileDialog.FilterIndex = 1;
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
string saveFileName = saveFileDialog.FileName;
ISaveAs2 pSaveAs = (ISaveAs2)raster;
pSaveAs.SaveAs(saveFileName, new RasterWorkspaceFactory().OpenFromFile(System.IO.Path.GetDirectoryName(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)), 0), "TIFF");
}
}
private void 栅格乘常数ToolStripMenuItem_Click(object sender, EventArgs e)
{
IRasterDataset rasterDataset = OpenTiffFile();
IRaster processedRaster = MapAlgebraOperationMULTIPLY(rasterDataset);
IRasterLayer rasterLayer = new RasterLayerClass();
rasterLayer.CreateFromRaster(processedRaster);
rasterLayer.Name = "MULTIPLY";
axMapControl2.AddLayer((ILayer)rasterLayer, 0);
axMapControl2.ActiveView.Refresh();
SaveRasterToFile(processedRaster);
}