C# ArcGIS Add-in 插件开发:栅格数据计算
以下是 C# 语言实现 ArcGIS Add-in 插件开发的详细代码,该插件实现对 5 个栅格数据进行计算并在地图中显示结果的功能:
- 创建项目
在 Visual Studio 中选择创建一个新项目,选择 ArcGIS Desktop Add-in 模板,命名为 GridCalculator,选择 ArcMap Add-in,并勾选 Create button on toolbar 选项,新建一个按钮。
- 编写代码
打开 GridCalculator.cs 文件,将按钮的 Click 事件处理程序改为以下代码:
private void btnCalculate_Click(object sender, EventArgs e)
{
// 获取当前地图文档
IMxDocument mxDoc = ArcMap.Application.Document as IMxDocument;
if (mxDoc == null)
{
MessageBox.Show('请打开一个地图文档!', '提示');
return;
}
// 获取当前活动视图
IActiveView activeView = mxDoc.ActiveView;
if (activeView == null)
{
MessageBox.Show('请打开一个地图视图!', '提示');
return;
}
// 获取当前选中的栅格图层
IRasterLayer rasterLayer = GetSelectedRasterLayer(activeView);
if (rasterLayer == null)
{
MessageBox.Show('请选中一个栅格图层!', '提示');
return;
}
// 获取栅格数据集
IRaster2 raster2 = rasterLayer.Raster as IRaster2;
IRasterDataset rasterDataset = raster2.RasterDataset;
// 获取栅格数据集的空间参考
ISpatialReference spatialReference = rasterDataset.SpatialReference;
// 获取栅格数据集的像元大小
double cellSize = raster2.MeanCellSize().X;
// 构造栅格计算器对象
IRasterCalculator rasterCalculator = new RasterCalculatorClass();
// 设置栅格计算器的环境参数
rasterCalculator.AddRaster(rasterDataset, 'data1');
rasterCalculator.AddRaster(rasterDataset, 'data2');
rasterCalculator.AddRaster(rasterDataset, 'data3');
rasterCalculator.AddRaster(rasterDataset, 'data4');
rasterCalculator.AddRaster(rasterDataset, 'data5');
rasterCalculator.Expression = 'data1 / (data4 * data5) * Log10(data2 + data3 + 1)';
rasterCalculator.OutRasterName = 'result';
rasterCalculator.OutRasterPath = GetTempRasterPath();
// 运行栅格计算器
IGeoDataset resultGeoDataset = rasterCalculator.Execute();
// 对结果进行四次方根计算
IRasterBandCollection rasterBandCollection = resultGeoDataset as IRasterBandCollection;
IRasterBand rasterBand = rasterBandCollection.Item(0);
IRawPixels rawPixels = rasterBand as IRawPixels;
int width = resultGeoDataset.Width;
int height = resultGeoDataset.Height;
int stride = width;
object buffer = new float[width * height];
rawPixels.Read(0, 0, width, height, ref buffer);
for (int i = 0; i < width * height; i++)
{
float value = (float)buffer[i];
if (float.IsNaN(value) || float.IsInfinity(value) || value < 0)
{
buffer[i] = 0;
}
else
{
buffer[i] = (float)Math.Pow(value, 1.0 / 4);
}
}
rawPixels.Write(0, 0, width, height, ref buffer);
// 创建栅格图层
IRasterLayer resultRasterLayer = new RasterLayerClass();
resultRasterLayer.CreateFromRaster(resultGeoDataset);
// 设置栅格图层的空间参考和像元大小
IRasterProps rasterProps = resultRasterLayer.Raster as IRasterProps;
rasterProps.SpatialReference = spatialReference;
rasterProps.MeanCellSize = cellSize;
// 将栅格图层添加到地图中
activeView.FocusMap.AddLayer(resultRasterLayer);
// 刷新地图
activeView.Refresh();
}
private IRasterLayer GetSelectedRasterLayer(IActiveView activeView)
{
IEnumLayer enumLayer = activeView.FocusMap.get_Layers(null, true);
ILayer layer = enumLayer.Next();
while (layer != null)
{
if (layer is IRasterLayer && activeView.IsItemSelected(layer))
{
return layer as IRasterLayer;
}
layer = enumLayer.Next();
}
return null;
}
private string GetTempRasterPath()
{
return Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString() + '.tif');
}
- 调试测试
按 F5 启动调试,打开一个地图文档,选中一个栅格图层,单击按钮 1,执行栅格计算并在地图中显示结果。
- 发布插件
在解决方案资源管理器中右键单击 GridCalculator 项目,选择发布 GridCalculator,按照向导完成发布过程。将生成的 GridCalculator.esriAddin 文件拷贝到其他机器上,双击安装即可。
该插件使用 IRasterCalculator 接口对 5 个栅格数据进行计算,计算公式为 data1 / (data4 * data5) * Log10(data2 + data3 + 1),最后对计算结果进行四次方根计算。计算结果将以栅格图层形式添加到地图中。
原文地址: https://www.cveoy.top/t/topic/nJVY 著作权归作者所有。请勿转载和采集!