当前位置:首页 > 代码相关 > 正文内容

PIE 分块读写数据

admin6年前 (2020-06-21)代码相关8722

手头的影像数据量比较大,尺寸是 20009*10165 的,直接创建数组会导致栈溢出,因此决定分块,思路也比较简单,如图:

image.png

只是把x分成多份,y不变,这样代码写起来也简单,只要做好最后一个块的宽度的判断就好了。

我这里是把一个float型的单波段影像做了一个阈值分割,输出到一个byte影像中,分块是以 3000*高度 为一个块,代码如下:

            int BandCount = hyData.GetBandCount();
            int ImgWidth = hyData.GetRasterXSize();
            int ImgHeight = hyData.GetRasterYSize();
            string SpatialRef = hyData.SpatialReference.ExportToPrettyWkt();
            PixelDataType DataType = hyData.GetRasterBand(0).GetRasterDataType();

            SaveFileDialog SaveData = new SaveFileDialog();
            SaveData.Filter = "RasterFileData|*.tiff";
            if (SaveData.ShowDialog() != DialogResult.OK) return;

            int[] bandMap = new int[BandCount];
            for (int i = 0; i < BandCount; i++)
            {
                bandMap[i] = i + 1;
            }
            IRasterDataset newRasterDataset = DatasetFactory.CreateRasterDataset(SaveData.FileName, ImgWidth, ImgHeight, BandCount, DataType, "GTiff", null);
            newRasterDataset.SpatialReference = hyData.SpatialReference;

            float[] data = new float[ImgHeight * 3000];
            byte[] result = new byte[ImgHeight * 3000];
            //读取数据到数组
            int times = ImgWidth / 3000;
            for (int i = 0; i < times + 1; i++)
            {
                if (i != times)
                {
                    hyData.Read(i * 3000, 0, 3000, ImgHeight, data, 3000, ImgHeight, DataType, BandCount, bandMap);
                }
                else
                {
                    hyData.Read(i * 3000, 0, ImgWidth % 3000, ImgHeight, data, ImgWidth % 3000, ImgHeight, DataType, BandCount, bandMap);
                }

                for (int j = 0; j < data.Length; j++)
                {
                    if (data[j] > 0.05)
                    {
                        result[j] = 255;
                    }
                    else
                    {
                        result[j] = 0;
                    }
                }
                if (i != times)
                {
                    newRasterDataset.Write(i * 3000, 0, 3000, ImgHeight, result, 3000, ImgHeight, PixelDataType.Byte, BandCount, bandMap);
                }
                else
                {
                    newRasterDataset.Write(i * 3000, 0, ImgWidth % 3000, ImgHeight, result, ImgWidth % 3000, ImgHeight, PixelDataType.Byte, BandCount, bandMap);
                }

            }


            double[] geoTrans = hyData.GetGeoTransform();
            newRasterDataset.SetGeoTransform(geoTrans);

            ((IDisposable)newRasterDataset).Dispose();

            MessageBox.Show("新建tiff成功");


扫描二维码推送至手机访问。

版权声明:本文由lovedm.club发布,如需转载请注明出处。

本文链接:https://lovedm.club/?id=58

分享给朋友:

“PIE 分块读写数据” 的相关文章

C# WPF程序 显示时间

C# WPF程序 显示时间

例子来源于此视频https://www.bilibili.com/video/av1422127?p=4 此例子是想说明有的类主要使用它的事件namespace Wpf_test {     /// <summary> &...

C#的类型系统

C#的类型系统

C#的五大数据类型:    类(Class)    结构体(Structures)    枚举(Enumerations)    接口(In...

C# 泛型委托

C# 泛型委托

虽然没有必要,但是还是先看看自定义的泛型委托:namespace _20200402 {     class Program     {     &nb...

C# Lambda表达式

简单用法,一句一句来,便于理解 Func<int, int, int> func = new Func<int, int, int>((int a, int b) => { return a * b; });(int a, int b) => { ret...

C# 测量运行时间

使用Stopwatch类进行运行时间的监测要使用 System.Diagnostics 命名空间方法表 4Reset()停止时间间隔测量,并将运行时间重置为零。Restart()停止时间间隔测量,将运行时间重置为零,然后开始测量运行时间。Start()开始或继续测量某个时间间隔的运行时间。...

C# 与文件相关的几个类(2)

Directory类:静态类,主要处理文件目录。方法:CreateDirectory(String)在指定路径中创建所有目录和子目录,除非它们已经存在。返回值是一个DirectoryInfo对象Delete(String)从指定路径删除空目录。无返回值。Exists(String)确定给定路径是否引...