使用C#开发ArcGIS桌面插件:读取和计算栅格数据
首先,在Visual Studio中新建一个ArcGIS桌面插件项目,选择C#语言。
然后,在插件项目中添加以下控件:
- MapControl控件:用于显示地图和栅格数据。
- Button控件1和Button控件2:用于读取栅格数据。
- Button控件3和Button控件4:用于计算像元值之和。
- Textbox控件:用于显示计算结果。
然后,在代码中添加以下功能实现:
- 在Button控件1和Button控件2的Click事件中分别调用ArcObjects中的RasterLayerClass和IRasterDataset接口读取栅格数据,并将读取到的栅格数据添加到MapControl控件中显示。
- 在Button控件3和Button控件4的Click事件中分别遍历两个栅格数据的像元值,并计算像元值之和,并将结果显示在Textbox控件中。
下面是示例代码:
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.DataSourcesRaster;
using ESRI.ArcGIS.Geodatabase;
using System;
using System.Windows.Forms;
namespace RasterAddin
{
public partial class RasterAddin : UserControl
{
private IRasterLayer rasterLayer1 = null;
private IRasterLayer rasterLayer2 = null;
public RasterAddin()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// 读取栅格数据1
OpenFileDialog dlg = new OpenFileDialog();
dlg.Filter = "Raster files (*.tif)|*.tif";
if (dlg.ShowDialog() == DialogResult.OK)
{
IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactory();
IRasterWorkspace rasterWorkspace = (IRasterWorkspace)workspaceFactory.OpenFromFile(System.IO.Path.GetDirectoryName(dlg.FileName), 0);
IRasterDataset rasterDataset = rasterWorkspace.OpenRasterDataset(System.IO.Path.GetFileName(dlg.FileName));
rasterLayer1 = new RasterLayerClass();
rasterLayer1.CreateFromDataset(rasterDataset);
axMapControl1.AddLayer(rasterLayer1);
}
}
private void button2_Click(object sender, EventArgs e)
{
// 读取栅格数据2
OpenFileDialog dlg = new OpenFileDialog();
dlg.Filter = "Raster files (*.tif)|*.tif";
if (dlg.ShowDialog() == DialogResult.OK)
{
IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactory();
IRasterWorkspace rasterWorkspace = (IRasterWorkspace)workspaceFactory.OpenFromFile(System.IO.Path.GetDirectoryName(dlg.FileName), 0);
IRasterDataset rasterDataset = rasterWorkspace.OpenRasterDataset(System.IO.Path.GetFileName(dlg.FileName));
rasterLayer2 = new RasterLayerClass();
rasterLayer2.CreateFromDataset(rasterDataset);
axMapControl1.AddLayer(rasterLayer2);
}
}
private void button3_Click(object sender, EventArgs e)
{
// 计算像元值之和1
if (rasterLayer1 != null)
{
IRaster2 raster = (IRaster2)rasterLayer1.Raster;
IPnt pnt = new PntClass();
pnt.SetCoords(0, 0);
double sum = 0;
for (int i = 0; i < raster.Width; i++)
{
for (int j = 0; j < raster.Height; j++)
{
object val = raster.GetPixelValue(0, i, j);
if (val != null && val is double)
{
sum += (double)val;
}
}
}
textBox1.Text = sum.ToString();
}
}
private void button4_Click(object sender, EventArgs e)
{
// 计算像元值之和2
if (rasterLayer2 != null)
{
IRaster2 raster = (IRaster2)rasterLayer2.Raster;
IPnt pnt = new PntClass();
pnt.SetCoords(0, 0);
double sum = 0;
for (int i = 0; i < raster.Width; i++)
{
for (int j = 0; j < raster.Height; j++)
{
object val = raster.GetPixelValue(0, i, j);
if (val != null && val is double)
{
sum += (double)val;
}
}
}
textBox1.Text = sum.ToString();
}
}
}
}
原文地址: https://www.cveoy.top/t/topic/nJO0 著作权归作者所有。请勿转载和采集!