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

PIE 分块读写数据

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

手头的影像数据量比较大,尺寸是 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# 委托

C# 委托

Action和Func是.NET类库的内置委托,以简便使用。Func有17个重载还可以使用delegate关键字创建委托下面的代码展示了这三种使用委托的方法namespace _20200327 {     public delegat...

C# 正则表达式(1)

C# 正则表达式(1)

用于匹配输入文本的模式string s = "this is a test!"; string res = Regex.Replace(s, "^",&nbs...

C# 抽象类与接口的比较

相同:都不能被实例化都包含未实现的方法派生类必须实现未实现的方法不同:抽象类可以包含抽象成员,也可以包含非抽象成员,即抽象类可以是完全实现的,也可以是部分实现的,或者是完全不实现的。接口更像是只包含抽象成员的抽象类,或者说接口内的成员都是未被实现的。一个类只能继承一个抽象类(当然其它类也一样),但是...

C语言malloc()函数

C语言中malloc()函数,用于分配所需的内存,并返回一个指向该内存的指针。注意这是C的标准库函数,不是C的关键字,在<stdlib.h>头文件下。函数声明: void *malloc(size_t size)其中,size是要分配的内存的大小,单位是字节。返回一个指针 ,指向已分配大...

C语言 异或运算符 ^

C语言中异或运算符^表示参见运算的二进制运算符相同为0,不同为1,如下:1 ^ 1 = 01 ^ 0 = 10 ^ 1 = 10 ^ 0 = 0下面举例说明∧运算符的应用:  (1)使特定位翻转  假设有01111010,想使其低4位翻转,即1变为0,0变为1。可以将它与00001111进行∧运算,...

字节序问题

字节序问题

前阵子读取一个文件,在读取的时候按照文件的描述逐字节读取,但是这个文件的文件头部分数据是分大小端的,这就牵扯到了大小端的转换问题,这里要描述一下字节序。计算机数据存储有两种字节优先顺序:高位字节优先(称为大端模式)和低位字节优先(称为小端模式)。大端模式,是指数据的高字节保存在内存的低地址中,而数据...