AE开发第八天

本文介绍了如何在C#中使用OpenTiffFile函数处理DEM数据,包括计算坡长、LS因子的算法,并强调了内存泄漏问题的修复以及栅格重分类的方法。
摘要由CSDN通过智能技术生成

今天发现一个问题,之前没写释放内存的代码,结果运行代码的时候出现内存泄漏了。。

这个之后再解决,还有要解决之前重分类会改变源数据的问题。

今天实现的是由dem计算坡长,然后计算LS因子。

 private void 坡长计算ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // 自定义的提示信息
            string customMessage1 = "请输入DEM栅格";
            // 显示自定义提示信息
            MessageBox.Show(customMessage1, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            IRasterDataset rasterDataset1 = OpenTiffFile();
            if (rasterDataset1 == null)
            {
                MessageBox.Show("未选择任何TIFF文件或者打开文件失败。");
                return;
            }
            // 自定义的提示信息
            string customMessage2 = "请输入坡度栅格";
            // 显示自定义提示信息
            MessageBox.Show(customMessage2, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            IRasterDataset rasterDataset2 = OpenTiffFile();
            if (rasterDataset2 == null)
            {
                MessageBox.Show("未选择任何TIFF文件或者打开文件失败。");
                return;
            }
            IRaster processedRaster = MapAlgebraOperationLength(rasterDataset1, rasterDataset2);
            IRasterLayer rasterLayer = new RasterLayerClass();
            rasterLayer.CreateFromRaster(processedRaster);
            rasterLayer.Name = "Length";

            axMapControl2.AddLayer((ILayer)rasterLayer, 0);
            axMapControl2.ActiveView.Refresh();
            SaveRasterToFile(processedRaster);
        }
        private IRaster MapAlgebraOperationLength(IRasterDataset rasterDataset1, IRasterDataset rasterDataset2)
        {
            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)rasterDataset1, "Ras01");
            pMapAlgebraOp.BindRaster((IGeoDataset)rasterDataset2, "Ras02");
            string sOut = "[Ras01] / (sin([Ras02] * 3.14 / 180))";
            IRaster resultRaster = (IRaster)pMapAlgebraOp.Execute(sOut);
            return resultRaster;
        }

        private void l因子计算ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // 自定义的提示信息
            string customMessage1 = "请输入坡度栅格";
            IRaster resultRaster = null;
            // 显示自定义提示信息
            MessageBox.Show(customMessage1, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            IRasterDataset rasterDataset = OpenTiffFile();
            if (rasterDataset == null)
            {
                MessageBox.Show("未选择任何TIFF文件或者打开文件失败。");
                return;
            }
            // 自定义的提示信息
            string customMessage2 = "请输入坡长栅格";
            IRaster resultRaster1 = null;
            // 显示自定义提示信息
            MessageBox.Show(customMessage2, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            IRasterDataset rasterDataset1 = OpenTiffFile();
            if (rasterDataset == null)
            {
                MessageBox.Show("未选择任何TIFF文件或者打开文件失败。");
                return;
            }
            //调用 reclass 方法
            resultRaster = reclass4(rasterDataset.CreateDefaultRaster(), rasterDataset1.CreateDefaultRaster());

            IRasterLayer rasterLayer = new RasterLayerClass();
            rasterLayer.CreateFromRaster(resultRaster);
            rasterLayer.Name = "重分类";

            axMapControl2.AddLayer((ILayer)rasterLayer, 0);
            axMapControl2.ActiveView.Refresh();
            SaveRasterToFile(resultRaster);
        }

        private void s因子计算ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // 自定义的提示信息
            string customMessage1 = "请输入坡度栅格";
            IRaster resultRaster = null;
            // 显示自定义提示信息
            MessageBox.Show(customMessage1, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            IRasterDataset rasterDataset = OpenTiffFile();
            if (rasterDataset == null)
            {
                MessageBox.Show("未选择任何TIFF文件或者打开文件失败。");
                return;
            }

            //调用 reclass 方法
            resultRaster = reclass3(rasterDataset.CreateDefaultRaster());

            IRasterLayer rasterLayer = new RasterLayerClass();
            rasterLayer.CreateFromRaster(resultRaster);
            rasterLayer.Name = "重分类";

            axMapControl2.AddLayer((ILayer)rasterLayer, 0);
            axMapControl2.ActiveView.Refresh();
            SaveRasterToFile(resultRaster);
        }
        private IRaster reclass3(IRaster pRaster)
        {
            IRasterProps rasterProps = (IRasterProps)pRaster;

            //设置栅格数据起始点  
            IPnt pBlockSize = new Pnt();
            pBlockSize.SetCoords(rasterProps.Width, rasterProps.Height);

            //选取整个范围  
            IPixelBlock pPixelBlock = pRaster.CreatePixelBlock(pBlockSize);

            //左上点坐标  
            IPnt tlp = new Pnt();
            tlp.SetCoords(0, 0);

            //读入栅格  
            IRasterBandCollection pRasterBands = pRaster as IRasterBandCollection;
            IRasterBand pRasterBand = pRasterBands.Item(0);
            IRawPixels pRawPixels = pRasterBands.Item(0) as IRawPixels;
            pRawPixels.Read(tlp, pPixelBlock);

            //将PixBlock的值组成数组  
            System.Array pSafeArray = pPixelBlock.get_SafeArray(0) as System.Array;
            List<double> pixelValues = new List<double>();
            System.Array dataArray = pSafeArray;
            double temp = 0;
            for (int y = 0; y < rasterProps.Height; y++)
            {
                for (int x = 0; x < rasterProps.Width; x++)
                {
                    double value = Convert.ToDouble(dataArray.GetValue(x, y));

                    if (value <= 5 && value >= 0)
                    {
                        temp = 10.8 * Math.Sin(value * Math.PI /180) + 0.03;
                        dataArray.SetValue((float)temp, x, y);
                    }
                    else if (value > 5 && value <= 10)
                    {
                        temp = 16.8 * Math.Sin(value * Math.PI / 180) -0.5 ;
                        dataArray.SetValue((float)temp, x, y);
                    }
                    else if (value > 10 && value <=25)
                    {
                        temp = 20.204 * Math.Sin(value * Math.PI / 180) - 1.2404;
                        dataArray.SetValue((float)temp, x, y);
                    }
                    else if (value > 25)
                    {
                        temp = 29.585 * Math.Sin(value * Math.PI / 180) - 5.6079;
                        dataArray.SetValue((float)temp, x, y);
                    }
                    else
                    {
                        dataArray.SetValue(float.NaN, x, y); // 设置为空值
                    }
                }
            }
            pPixelBlock.set_SafeArray(0, pSafeArray);

            //编辑raster,将更新的值写入raster中  
            IRasterEdit rasterEdit = pRaster as IRasterEdit;
            rasterEdit.Write(tlp, pPixelBlock);
            rasterEdit.Refresh();
            return pRaster;
        }
        private IRaster reclass4(IRaster pRaster1, IRaster pRaster2)
        {
            IRasterProps rasterProps1 = (IRasterProps)pRaster1;

            //设置栅格数据起始点  
            IPnt pBlockSize1 = new Pnt();
            pBlockSize1.SetCoords(rasterProps1.Width, rasterProps1.Height);

            //选取整个范围  
            IPixelBlock pPixelBlock1 = pRaster1.CreatePixelBlock(pBlockSize1);

            //左上点坐标  
            IPnt tlp = new Pnt();
            tlp.SetCoords(0, 0);

            IRasterProps rasterProps2 = (IRasterProps)pRaster1;

            //设置栅格数据起始点  
            IPnt pBlockSize2 = new Pnt();
            pBlockSize2.SetCoords(rasterProps2.Width, rasterProps2.Height);

            //选取整个范围  
            IPixelBlock pPixelBlock2 = pRaster2.CreatePixelBlock(pBlockSize2);


            //读入栅格  
            IRasterBandCollection pRasterBands1 = pRaster1 as IRasterBandCollection;
            IRasterBand pRasterBand1 = pRasterBands1.Item(0);
            IRawPixels pRawPixels1 = pRasterBands1.Item(0) as IRawPixels;
            pRawPixels1.Read(tlp, pPixelBlock1);

            //读入栅格  
            IRasterBandCollection pRasterBands2 = pRaster2 as IRasterBandCollection;
            IRasterBand pRasterBand2 = pRasterBands2.Item(0);
            IRawPixels pRawPixels2 = pRasterBands2.Item(0) as IRawPixels;
            pRawPixels2.Read(tlp, pPixelBlock2);

            //将PixBlock的值组成数组  
            System.Array pSafeArray1 = pPixelBlock1.get_SafeArray(0) as System.Array;
            List<double> pixelValues1 = new List<double>();
            System.Array dataArray1 = pSafeArray1;

            System.Array pSafeArray2 = pPixelBlock2.get_SafeArray(0) as System.Array;
            List<double> pixelValues2 = new List<double>();
            System.Array dataArray2 = pSafeArray2;

            double temp = 0;
            if(rasterProps1.Height != rasterProps2.Height || rasterProps1.Width!= rasterProps2.Width)
            {
                MessageBox.Show("栅格范围不相等,请调整栅格范围");
            }

            for (int y = 0; y < rasterProps1.Height; y++)
            {
                for (int x = 0; x < rasterProps1.Width; x++)
                {
                    double flag = Convert.ToDouble(dataArray1.GetValue(x, y));
                    double value = Convert.ToDouble(dataArray2.GetValue(x, y));


                    if (flag <= 1 && flag >= 0)
                    {
                        temp = Math.Pow(value/22.13,0.2);
                        dataArray2.SetValue((float)temp, x, y);
                    }
                    else if (flag > 1 && flag <= 3)
                    {
                        temp = Math.Pow(value / 22.13, 0.3);
                        dataArray2.SetValue((float)temp, x, y);
                    }
                    else if (flag > 3 && flag <= 5)
                    {
                        temp = Math.Pow(value / 22.13, 0.4);
                        dataArray2.SetValue((float)temp, x, y);
                    }
                    else if (flag > 5)
                    {
                        temp = Math.Pow(value / 22.13, 0.5);
                        dataArray2.SetValue((float)temp, x, y);
                    }
                    else
                    {
                        dataArray2.SetValue(float.NaN, x, y); // 设置为空值
                    }
                }
            }
            pPixelBlock2.set_SafeArray(0, pSafeArray2);

            //编辑raster,将更新的值写入raster中  
            IRasterEdit rasterEdit = pRaster2 as IRasterEdit;
            rasterEdit.Write(tlp, pPixelBlock2);
            rasterEdit.Refresh();
            return pRaster2;
        }
    }

主要使用的还是栅格重分类方法。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值