AE二次开发第四天

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);
        }

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值