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

PIE 分块读写数据

admin3年前 (2020-06-21)代码相关1154

手头的影像数据量比较大,尺寸是 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 分块读写数据” 的相关文章

九九乘法表算法

九九乘法表算法

namespace _20200324 {     class Program     {         st...

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

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

C# 与文件访问相关的常用的类:File类、Directory类、Path类、FileInfo类、DirectoryInfo类、FileSystemInfo类、FileSystemWatcher类以上几个类均在System.IO命名空间下。挨个说吧:File类:静态类,只有静态方法,用于移...

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

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

C# 使用FileStream进行文件复制操作

使用文件流进行操作,如下,其中注释部分是和非注释部分一样的,但是使用using语句是执行完后自动释放内存,而注释部分是手动释放。CopyFile方法中,缓冲区大小设为1024*1024字节,也就是1MB,Read方法和Write方法中,第一个参数都是缓冲区数组,第二个参数都是偏移量,这个量是在缓冲区...

C# 多线程(1)

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

偶然想到的一个问题。。。

偶然想到的一个问题。。。

今天突然想C#中,用数组中的Max()方法和直接通过比较获取最大值的时间谁快,于是试了试:       static void Main(string[] args)   &nb...