当前位置:   article > 正文

【GDAL】GDAL库学习(C#版本)

【GDAL】GDAL库学习(C#版本)

1.GDAL

处理地理信息数据的开源库。提供了一系列工具和API,供开发者能够读取、转换、写入和处理多种栅格和矢量地理空间数据格式。
GDAL提供了C++、Python、Java、C#等多种编程语言的API,使开发者能够在不同的编程环境中使用GDAL的功能。

2.VS2022配置GDAL环境(C#),测试读取tiff图片

VS2022工具–NuGet包管理器–管理解决方案的NuGet程序包,直接安装GDAL包。

在这里插入图片描述
并且直接用应用到当前的控制台程序中。
找一张tiff格式的图片,或者用格式转换网站:https://www.zamzar.com/.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OSGeo.GDAL;

namespace GDAL_test
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //使用之前必须要配置、注册
            GdalConfiguration.ConfigureGdal();
            GdalConfiguration.ConfigureOgr();
            Gdal.AllRegister();
            string tiffFilePath = "D:\\Users\\59723\\Desktop\\su7.tiff";

            // Open函数返回了Dataset类型的对象,相当于实例化
            Dataset dataset = Gdal.Open(tiffFilePath, Access.GA_ReadOnly);

            if(dataset == null ) 
            {
                Console.WriteLine("无法打开文件");
                return; 
            }
            
            // 获取图像信息
            int rasterCount = dataset.RasterCount;
            int width = dataset.RasterXSize;
            int height = dataset.RasterYSize;
            Console.WriteLine($"宽度:{width},高度:{height},波段数:{rasterCount}");

            // 读取第一个波段
            Band band = dataset.GetRasterBand(1);
            if( band == null )
            {
                Console.WriteLine("无法读取波段");
                return ;
            }
            // 这个地方被坑了好久,新版本的ComputeRasterMinMax(double[] argout, int approx_ok),已经没有out入参关键字了
            double[] minMax = { 0, 0 };
            band.ComputeRasterMinMax(minMax, 0);
            Console.WriteLine($"最小值: {minMax[0]}, 最大值: {minMax[1]}");

            // 读取波段数据
            // 在堆区开辟了一个float[]类型的数组变量,大小为width * height图片像素
            float[] rasterData = new float[width * height];
            // 参数1-2:左上角位置,参数3-4:目标区域大小,参数5:接收容器,参数6-7:容器的宽高,参数8-9:默认0
            band.ReadRaster(0, 0, width, height, rasterData, width, height, 0, 0);
            // 处理波段数据 (例如,打印前10个像素值)
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine($"像素值[{i}]: {rasterData[i]}");
            }
            dataset.Dispose();

            Console.ReadKey();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62

3.读取GeoTiff图片并提取相关地理信息

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OSGeo.GDAL;

namespace GDAL_Geotiff
{
    internal class Program
    {
        static void Main(string[] args)
        {
            GdalConfiguration.ConfigureGdal();
            Gdal.AllRegister();

            string geotiff_file_path = "D:\\Users\\59723\\Desktop\\landscan-global-2022-colorized.tif";
            Dataset dataset = Gdal.Open(geotiff_file_path, Access.GA_ReadOnly);
            if(dataset == null ) 
            {
                Console.WriteLine("无法打开!");
                return;
            }

            Console.WriteLine("投影信息:");
            Console.WriteLine(dataset.GetProjection());
            //Console.ReadKey();

            double[] geoTransform = new double[6];
            dataset.GetGeoTransform(geoTransform);
            Console.WriteLine("地理变换参数:");
            Console.WriteLine("左上角X:" + geoTransform[0]);
            Console.WriteLine("像素宽度: " + geoTransform[1]);
            Console.WriteLine("旋转参数: " + geoTransform[2]);
            Console.WriteLine("左上角Y: " + geoTransform[3]);
            Console.WriteLine("旋转参数: " + geoTransform[4]);
            Console.WriteLine("像素高度: " + geoTransform[5]);

            int bandCount = dataset.RasterCount;
            Console.WriteLine($"波段数:{bandCount}");
            // 获取波段数
            for (int i=1; i<=bandCount;i++)
            {
                Band band = dataset.GetRasterBand(i); // 只有四个波段
                if (band == null)
                {
                    Console.WriteLine("无法获取波段信息");
                    return;
                }
                double min = 0, max = 0, mean = 0, stddev = 0;
                band.GetStatistics(0, 1, out min, out max, out mean, out stddev);
                Console.WriteLine($"--------波段{i}统计信息:");
                Console.WriteLine("最小值: " + min);
                Console.WriteLine("最大值: " + max);
                Console.WriteLine("均值: " + mean);
                Console.WriteLine("标准差: " + stddev);
            }
            Console.ReadKey();

            dataset.Dispose();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

解释:
1.dataset.GetGeoTransform(geoTransform);
返回一个包含6个参数的数组:

  • geoTransform[0]:左上角像素的X坐标(地理坐标)。
  • geoTransform[1]:像素宽度(水平分辨率,表示一个像素对应的实际距离)。
  • geoTransform[2]:旋转参数(通常为0,如果图像是正北向上)。
  • geoTransform[3]:左上角像素的Y坐标(地理坐标)。
  • geoTransform[4]:旋转参数(通常为0,如果图像是正北向上)。
  • geoTransform[5]:像素高度(垂直分辨率,通常为负值,因为图像通常从左上角开始)。

地理变换参数的公式:假设你有一个像素位置 (i, j),要计算其地理坐标 (X, Y),可以使用以下公式:
double x = geoTransform[0] + i * geoTransform[1] + j * geoTransform[2];
double y = geoTransform[3] + i * geoTransform[4] + j * geoTransform[5];

2.band.GetStatistics(0, 1, out min, out max, out mean, out stddev);

public void GetStatistics(
    int approxOK,
    int force,
    out double min,
    out double max,
    out double mean,
    out double stddev
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • approxOK: 是否允许使用近似值。如果为1,表示允许返回近似统计数据;如果为0,则必须计算精确值。
  • force: 是否强制重新计算统计数据。如果为1,表示强制重新计算;如果为0,如果统计数据已存在,则使用现有数据。
  • min, max, mean, stddev: 输出参数,分别表示最小值、最大值、均值和标准差。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/632563
推荐阅读
相关标签
  

闽ICP备14008679号