c语言实现读取已知dem数据的高程值并计算填方挖方
由于DEM数据是以栅格形式存储的,因此需要先读取DEM数据的栅格信息,然后根据栅格信息计算出每个栅格的高程值。读取DEM数据的代码如下:
#include <stdio.h>
#define ROWS 1000 // DEM数据的行数
#define COLS 1000 // DEM数据的列数
// 读取DEM数据的函数
void readDEMData(float demData[ROWS][COLS], char* filename) {
FILE* fp = fopen(filename, "r"); // 打开DEM数据文件
if (fp == NULL) {
printf("Error: failed to open file %s\n", filename);
return;
}
// 读取DEM数据的栅格信息
int ncols, nrows;
float xllcorner, yllcorner, cellsize, nodata;
fscanf(fp, "ncols %d\n", &ncols);
fscanf(fp, "nrows %d\n", &nrows);
fscanf(fp, "xllcorner %f\n", &xllcorner);
fscanf(fp, "yllcorner %f\n", &yllcorner);
fscanf(fp, "cellsize %f\n", &cellsize);
fscanf(fp, "NODATA_value %f\n", &nodata);
// 读取DEM数据的高程值
for (int i = 0; i < nrows; i++) {
for (int j = 0; j < ncols; j++) {
fscanf(fp, "%f", &demData[i][j]);
}
}
fclose(fp); // 关闭DEM数据文件
}
读取DEM数据后,就可以计算填方挖方了。假设需要计算一个区域的填方挖方,可以先计算出该区域的总体积,然后减去该区域的实际体积,即为填方或挖方的体积。计算填方挖方的代码如下:
// 计算填方挖方的函数
void calculateCutFill(float demData[ROWS][COLS], int startX, int startY, int endX, int endY) {
float cellsize = 1.0; // DEM数据的栅格大小,假设为1.0
float nodata = -9999.0; // DEM数据中的无效值,假设为-9999.0
float z;
float totalVolume = 0.0; // 区域的总体积
float actualVolume = 0.0; // 区域的实际体积
// 计算区域的总体积
for (int i = startY; i <= endY; i++) {
for (int j = startX; j <= endX; j++) {
z = demData[i][j];
if (z != nodata) {
totalVolume += cellsize * cellsize * z;
}
}
}
// 计算区域的实际体积
for (int i = startY; i <= endY; i++) {
for (int j = startX; j <= endX; j++) {
z = demData[i][j];
if (z != nodata) {
actualVolume += cellsize * cellsize * (z - demData[startY][startX]);
}
}
}
// 计算填方或挖方的体积
float cutFillVolume = totalVolume - actualVolume;
if (cutFillVolume > 0) {
printf("填方体积为%f\n", cutFillVolume);
} else if (cutFillVolume < 0) {
printf("挖方体积为%f\n", -cutFillVolume);
} else {
printf("填方挖方体积为0\n");
}
}
以上代码中,startX、startY、endX、endY分别表示需要计算填方挖方的区域的左上角和右下角的坐标。计算填方挖方时,需要注意DEM数据中的无效值,需要将其排除在外
原文地址: https://www.cveoy.top/t/topic/fsFQ 著作权归作者所有。请勿转载和采集!