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

PIE 分块读写数据

admin4年前 (2020-06-21)代码相关7223

手头的影像数据量比较大,尺寸是 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发布,如需转载请注明出处。

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

分享给朋友:

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

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)确定给定路径是否引...

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

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

C# 多线程(1)

一、首先看几个词的含义:进程:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。线程:线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的...

C# 抽象类与接口的比较

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