C# GDAL生成DEM
时间: 2025-01-02 17:37:59 浏览: 10
### 使用 C# 和 GDAL 创建数字高程模型 (DEM)
为了使用 C# 和 GDAL 库来创建并处理数字高程模型(DEM),可以按照如下方法编写代码。这段程序展示了如何加载 TIFF 文件中的地理空间数据,并提取其中的高程信息。
#### 加载和初始化 GDAL
首先,在项目中引入 GDAL 的 NuGet 包 `Net.GDAL` 或者其他适合的方式安装 GDAL SDK。接着,确保在应用程序启动时调用了 GdalConfiguration 配置静态类以设置环境变量路径指向 GDAL 数据目录:
```csharp
using OSGeo.GDAL;
// ...
GdalConfiguration.ConfigureGdal();
```
#### 打开栅格数据集与获取基本信息
下面的例子说明了怎样打开一个 TIF 格式的 DEM 文件,并从中读取基本属性如尺寸大小、仿射变换参数等:
```csharp
string filePath = @"path\to\your\digital_elevation_model.tif";
Dataset dataset = Gdal.Open(filePath, Access.GA_ReadOnly);
double[] geotransform = new double[6];
dataset.GetGeoTransform(geotransform); // 获取仿射变换矩阵
int xSize = dataset.RasterXSize; // 宽度像素数
int ySize = dataset.RasterYSize; // 高度像素数
float[,] terrainData = new float[xSize, ySize]; // 存储地形高度的数据结构
```
#### 提取单波段图像数据
对于大多数 DEM 来说,通常只有一个代表地面海拔高度的灰度通道。因此只需要关注第一个波段即可:
```csharp
Band band = dataset.GetRasterBand(1);
band.ReadRaster(0, 0, xSize, ySize, terrainData, xSize, ySize, 0, 0);
// 处理无效值的情况
double noDataValue;
int hasVal;
band.GetNoDataValue(out noDataValue, out hasVal);
if (hasVal != 0 && !Double.IsNaN(noDataValue))
{
for (int i = 0; i < xSize; ++i)
{
for (int j = 0; j < ySize; ++j)
{
if (terrainData[i, j] == noDataValue)
terrainData[i, j] = float.NaN; // 将无数据区域标记为 NaN
}
}
}
```
上述过程会将原始影像转换成二维数组形式存储起来以便后续操作[^1]。
#### 计算统计量
有时可能还需要知道整个区域内最高最低点的位置以及对应的坐标位置。这可以通过遍历所有像元完成计算得到:
```csharp
double minValue = Double.MaxValue;
double maxValue = Double.MinValue;
Point minLocation = null;
Point maxLocation = null;
for (int row = 0; row < ySize; ++row)
{
for (int col = 0; col < xSize; ++col)
{
var value = terrainData[col, row];
if (!Double.IsNaN(value))
{
if (value < minValue)
{
minValue = value;
minLocation = new Point(col * geotransform[1], row * geotransform[5]);
}
if (value > maxValue)
{
maxValue = value;
maxLocation = new Point(col * geotransform[1], row * geotransform[5]);
}
}
}
}
Console.WriteLine($"Min Elevation: {minValue} at ({minLocation.X}, {minLocation.Y})");
Console.WriteLine($"Max Elevation: {maxValue} at ({maxLocation.X}, {maxLocation.Y})");
```
以上就是利用 C# 结合 GDAL 进行简单 DEM 分析的一个实例[^3]。
阅读全文