基于AE+C#的栅格IDW插值的实现

  查阅了许多参考资料,代码五花八门,能用的确少之又少,即便百般调试之下也会出些意料之外且无能为力的BUG,其中艰难不足为外人道也。但是最终仍是实现了插值的效果,于是写下这篇博文一是给有需求的小伙伴们一点参考,二是纪念下自己在这个点投入的并不对称的汗水和收获。。。。

 在我这个系统中的IDW插值实现,主要可以分为两个部分,一是对目标点图层进行插值,二是对插值结果(栅格图层)进行栅格渲染(代码会在下面给出)。在这之前先给大家提供实现此功能所需添加的引用,每次参考哪些大神的博客时,都在在这个上面话不少功夫。

using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.DataSourcesFile;
using Microsoft.VisualBasic;

using ESRI.ArcGIS.GeoAnalyst;

  进行插值时主要可分为以下几个步骤,一是创建目标点图层的要素图层,IDW插值的环境设置,包括像元大小、搜索半径等(如果程序在这里报错,建议将目标点图层在ARCMAP中先利用IDW插值功能运行一遍,如果能成功出图,记录下各类参数),代码如下:

#region 插值
            IInterpolationOp pInterpolationOp;
            pInterpolationOp = new RasterInterpolationOpClass();
            IFeatureClass pFeatureClass;
            IFeatureLayer pFeaturelayer;
            pFeaturelayer = this.axMapControl1.Map.get_Layer(0) as IFeatureLayer;//点图层在axMapControl控件的第一个,索引为0
            pFeatureClass = pFeaturelayer.FeatureClass; 
            IRasterRadius pRadius;
            pRadius = new RasterRadiusClass();
            object maxDistance = Type.Missing;
            pRadius.SetVariable(12, ref maxDistance);//定义搜索半径,本例为12
            IFeatureClassDescriptor pFCDescriptor;
            pFCDescriptor = new FeatureClassDescriptorClass();
            pFCDescriptor.Create(pFeatureClass, null, "value");//设置进行插值的属性字段
            object dCellSize = 113.039027413432;//设置像元值(参考ARCMAP)
            IRasterAnalysisEnvironment pEnv;
            pEnv = new RasterAnalysis();
            pEnv = pInterpolationOp as IRasterAnalysisEnvironment;
            pEnv.SetCellSize(esriRasterEnvSettingEnum.esriRasterEnvValue, ref dCellSize);
            object objectbarrier = Type.Missing;
            IGeoDataset rasDataset;
            rasDataset = pInterpolationOp.IDW((IGeoDataset)pFCDescriptor,
                2, pRadius, ref objectbarrier);
            IRaster pOutRaster;
            pOutRaster = rasDataset as IRaster;
            IRasterLayer pOutRasLayer;
            pOutRasLayer = new RasterLayerClass();
            pOutRasLayer.CreateFromRaster(pOutRaster);
            this.axMapControl1.AddLayer(pOutRasLayer, 0);// 输出结果至axMapControl1,并放置在第一层
            axMapControl1.ActiveView.Refresh();//刷新视图
            DialogResult dr = MessageBox.Show("插值成功,请选择是否进行分级渲染", "分级渲染选择",

           MessageBoxButtons.OKCancel, MessageBoxIcon.Information);//建立一个文件对话框的实例,用于接收用户指令。

  如果用户选择进行分级渲染,则进入一下代码模块:

 if (dr == DialogResult.OK)
            {
                //用户选择确认的操作(分级渲染)
                IRasterLayer pRasterLayer = axMapControl1.get_Layer(i) as IRasterLayer;//获取需要分级渲染的栅格图层,i为图层在axMapControl中的索引i
                int number = Convert.ToInt32(Interaction.InputBox("请输入栅格影像分类数量(默认为10)",
                    "字符串", "", 500, 250)); //调用VB的输入框获取用户需要的分级层数,默认为10
                if (number == 0)
                    number = 10;
                funColorForRaster_Classify(pRasterLayer, number);

                axMapControl1.ActiveView.Refresh();

             } 

    funColorForRaster_Classify(IRasterLayer pRasterLayer,int number)是一个自定义的方法,用于为输入的栅格图层按照指定的分级数量进行分级渲染,其代码如下:

            IRasterClassifyColorRampRenderer pRClassRend = new
            RasterClassifyColorRampRenderer() as IRasterClassifyColorRampRenderer;
            IRasterRenderer pRRend = pRClassRend as IRasterRenderer;
            IRaster pRaster = pRasterLayer.Raster;//栅格图层转换为栅格图
            IRasterBandCollection pRBandCol = pRaster as IRasterBandCollection;
            IRasterBand pRBand = pRBandCol.Item(0);
            if (pRBand.Histogram == null)
            {
                pRBand.ComputeStatsAndHist();
            }
            pRRend.Raster = pRaster;
            pRClassRend.ClassCount = number;//设置分级层次,默认为10
            pRRend.Update();
            //设置初始渐变色和结束渐变色
            MessageBox.Show("请选择初始颜色", "颜色选择", MessageBoxButtons.OK, MessageBoxIcon.Information);
            IRgbColor pFromColor = new RgbColor() as IRgbColor;
            selectColor(pFromColor);//自定义的一个方法,用于打开颜色选取对话框,为IRgbColor类的实例赋值
            MessageBox.Show("请选择结束颜色", "颜色选择", MessageBoxButtons.OK, MessageBoxIcon.Information);
            IRgbColor pToColor = new RgbColor() as IRgbColor;
            selectColor(pToColor);
            //进行栅格渲染并输出至axMapControl
            IAlgorithmicColorRamp colorRamp = new AlgorithmicColorRamp() as
            IAlgorithmicColorRamp;
            colorRamp.Size = 10;
            colorRamp.FromColor = pFromColor;
            colorRamp.ToColor = pToColor;
            bool createColorRamp;
            colorRamp.CreateRamp(out createColorRamp);
            IFillSymbol fillSymbol = new SimpleFillSymbol() as IFillSymbol;
            for (int i = 0; i < pRClassRend.ClassCount; i++)
            {
                fillSymbol.Color = colorRamp.get_Color(i);
                pRClassRend.set_Symbol(i, fillSymbol as ISymbol);
                pRClassRend.set_Label(i,
                pRClassRend.get_Break(i).ToString("0.00"));
            }
            pRasterLayer.Renderer = pRRend;
            IActiveView activeview = this.axMapControl1.ActiveView;
            activeview.ContentsChanged();
            //刷新窗口
            activeview.PartialRefresh(esriViewDrawPhase.esriViewGeography, null,
            null);

     selectColor(IRgbColor)的代码如下:

 //打开颜色选择对话框 并未IRGB类的三原色赋值
        private void selectColor(IRgbColor selColor)
        {
            ColorDialog colorDialog = new ColorDialog();
            colorDialog.AllowFullOpen = true;
            colorDialog.FullOpen = true;
            colorDialog.ShowHelp = true;
            colorDialog.Color = Color.Black;  //获取或设置用户所选定的颜色  
            colorDialog.ShowDialog();
            selColor.Red = colorDialog.Color.R;
            selColor.Green = colorDialog.Color.G;
            selColor.Blue = colorDialog.Color.B;
            MessageBox.Show("您选择的各颜色分量值分别为" + "\nR:" + colorDialog.Color.R.ToString()
                + "\nG:" + colorDialog.Color.G.ToString() + "\nB:" + colorDialog.Color.B.ToString());

        }

  本次分享到此结束,希望对有相关需要的小伙伴们有所帮助。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
栅格计算器是一种常见的计算机应用程序,它允许用户在一个矩形的网格中输入数值,然后对这些数值进行各种计算。在本文中,我们将使用C#AE(Adobe After Effects)来实现一个简单的栅格计算器功能。 首先,在AE中创建一个新的合成(Composition),并添加一个文本层(Text Layer)。将文本层的内容设置为“栅格计算器”,并将其放置在合成的顶部。 接下来,我们需要创建一个矩形网格,以便用户可以输入数值。我们可以使用AE中的形状层(Shape Layer)来创建一个矩形。在AE中,选择“Layer”->“New”->“Shape Layer”来创建一个新的形状层。选择“Rectangle Tool”(矩形工具),并在画布上绘制一个矩形。然后,选择矩形图层,打开“Add”->“Fill”属性,选择一种颜色填充矩形。 现在,我们需要将矩形网格分成若干个小格子,以便用户可以在其中输入数值。我们可以使用C#编写一个简单的脚本来完成这个任务。在Visual Studio中创建一个新的C#控制台应用程序,并将其命名为“GridCalculator”。 在GridCalculator项目中,我们需要添加一个引用,以便我们可以访问AE中的COM(Component Object Model)对象。选择“Project”->“Add Reference”,然后在“COM”选项卡中找到“Adobe After Effects XX.X Type Library”(其中XX.X表示你的AE版本号),并添加它。 接下来,我们需要编写一个C#脚本来创建网格。以下是一个示例脚本: ```csharp using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using AE_COM; namespace GridCalculator { class Program { static void Main(string[] args) { // Create a new AE project var ae = new Application(); var proj = ae.NewProject(); // Create a new composition var comp = proj.Items.AddComp("Grid Calculator", 1920, 1080, 1.0, 10.0, 30); // Add a new shape layer var shapeLayer = comp.Layers.AddShape(); shapeLayer.Name = "Grid"; // Create a new rectangle shape var rect = new Shape(); var rectGroup = new ShapeGroup(); rectGroup.AddShape(rect); shapeLayer.Property("Contents").AddProperty("ADBE Vector Group").SetValue(rectGroup); // Set the rectangle size rect.Size = new PointF(400, 400); // Create the grid var rows = 10; var cols = 10; var cellSize = new PointF(rect.Size.X / cols, rect.Size.Y / rows); for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) { // Create a new rectangle shape for each cell var cell = new Shape(); var cellGroup = new ShapeGroup(); cellGroup.AddShape(cell); shapeLayer.Property("Contents").AddProperty("ADBE Vector Group").SetValue(cellGroup); // Set the cell position and size var pos = new PointF(col * cellSize.X, row * cellSize.Y); cell.Position = pos; cell.Size = cellSize; } } // Save the project proj.Save(@"C:\GridCalculator.aep"); // Quit AE ae.Quit(); } } } ``` 在上面的脚本中,我们首先创建了一个新的AE项目和一个新的合成。然后,我们添加了一个新的形状层,并在其中创建了一个矩形。接下来,我们使用嵌套循环创建了一个网格,其中每个单元格都是一个独立的矩形。 最后,我们保存了AE项目,并退出AE应用程序。 现在,我们可以在AE中打开“GridCalculator.aep”文件,并将生成的网格图层拖放到我们之前创建的合成中。用户现在可以在每个单元格中输入数值,并使用AE中的表达式(Expressions)功能对这些数值进行计算。 总的来说,使用C#AE来创建栅格计算器功能是非常简单的。通过利用AE的COM对象和C#的编程能力,我们可以轻松地创建一个自定义的栅格计算器工具,以满足我们的具体需求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lemon_tttea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值