以下是 C# 语言实现 ArcGIS Add-in 插件开发的详细代码,该插件实现对 5 个栅格数据进行计算并在地图中显示结果的功能:

  1. 创建项目

在 Visual Studio 中选择创建一个新项目,选择 ArcGIS Desktop Add-in 模板,命名为 GridCalculator,选择 ArcMap Add-in,并勾选 Create button on toolbar 选项,新建一个按钮。

  1. 编写代码

打开 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');
}
  1. 调试测试

按 F5 启动调试,打开一个地图文档,选中一个栅格图层,单击按钮 1,执行栅格计算并在地图中显示结果。

  1. 发布插件

在解决方案资源管理器中右键单击 GridCalculator 项目,选择发布 GridCalculator,按照向导完成发布过程。将生成的 GridCalculator.esriAddin 文件拷贝到其他机器上,双击安装即可。

该插件使用 IRasterCalculator 接口对 5 个栅格数据进行计算,计算公式为 data1 / (data4 * data5) * Log10(data2 + data3 + 1),最后对计算结果进行四次方根计算。计算结果将以栅格图层形式添加到地图中。

C# ArcGIS Add-in 插件开发:栅格数据计算

原文地址: https://www.cveoy.top/t/topic/nJVY 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录