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

PIE 分块读写数据

admin5年前 (2020-06-21)代码相关8388

手头的影像数据量比较大,尺寸是 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://www.lovedm.club/?id=58

分享给朋友:

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

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

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

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

Path类,处理文件或路径的类,是一个静态类。方法:PathChangeExtension(String, String)更改路径字符串的扩展名。返回值为string。Combine(String, String)将两个字符串组合成一个路径。GetDirectoryName(String)返回指定路...

C# 返回值是接口的方法

今天写PIE二次开发加载栅格数据的时候发现类中方法的返回值是接口,之前没怎么写过,在此记录一下。在例子中设计一个接口 ICalculate ,接口中有两个方法, Add() 和 Div() 分别为加法和减法的功能,均有两个参数,参数和返回值的类型都是int类型。设计一个名为Calculat...

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进行∧运算,...

C语言字符串换行连接

C语言字符串换行连接

有时候遇到一个字符串太长一行放下不好看的情况,可以使用换行连接:一是使用 符号,如下所示:char* testString = "AAA BBB";运行如下:注意换行后的内容一定要顶到格子的最前面,否则会把前面的空格也算上。char* ...