当前位置: 首页> 科技> 能源 > 【GDAL】GDAL库学习(C#版本)

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

时间:2025/9/15 12:13:34来源:https://blog.csdn.net/qq_45306739/article/details/139157760 浏览次数:0次

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:默认0band.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();}}
}

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.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
);
  • approxOK: 是否允许使用近似值。如果为1,表示允许返回近似统计数据;如果为0,则必须计算精确值。
  • force: 是否强制重新计算统计数据。如果为1,表示强制重新计算;如果为0,如果统计数据已存在,则使用现有数据。
  • min, max, mean, stddev: 输出参数,分别表示最小值、最大值、均值和标准差。
关键字:【GDAL】GDAL库学习(C#版本)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: