#include <stdio.h> #include <stdlib.h>

#define PIXEL_SIZE 30.0 // 像素大小 #define NO_DATA_VALUE -9999 // 无效像素值

int main() { FILE *fp_dem; char *filename = "dem.tif"; int width, height, i, j; float *elevation; float fill_volume = 0.0, cut_volume = 0.0;

// 打开DEM.tif文件
fp_dem = fopen(filename, "rb");
if (fp_dem == NULL) {
    printf("Error: cannot open file %s!\n", filename);
    return 1;
}

// 读取DEM.tif文件头信息
fseek(fp_dem, 0x12, SEEK_SET);
fread(&width, 4, 1, fp_dem);
fread(&height, 4, 1, fp_dem);

// 计算DEM.tif文件大小
fseek(fp_dem, 0, SEEK_END);
long filesize = ftell(fp_dem);
long datasize = filesize - 0x44;

// 分配内存空间
elevation = (float *)malloc(datasize);

// 读取DEM.tif数据
fseek(fp_dem, 0x44, SEEK_SET);
fread(elevation, sizeof(float), datasize/sizeof(float), fp_dem);

// 遍历像素值,计算填方和挖方的体积
for (i = 0; i < height; i++) {
    for (j = 0; j < width; j++) {
        float elev1 = elevation[i*width+j];
        if (elev1 == NO_DATA_VALUE) {
            continue;
        }
        float elev2 = NO_DATA_VALUE;
        if (i > 0) {
            elev2 = elevation[(i-1)*width+j];
            if (elev2 != NO_DATA_VALUE) {
                float diff = elev1 - elev2;
                if (diff > 0) {
                    cut_volume += diff * PIXEL_SIZE * PIXEL_SIZE;
                } else {
                    fill_volume += (-diff) * PIXEL_SIZE * PIXEL_SIZE;
                }
            }
        }
        if (i < height-1) {
            elev2 = elevation[(i+1)*width+j];
            if (elev2 != NO_DATA_VALUE) {
                float diff = elev1 - elev2;
                if (diff > 0) {
                    cut_volume += diff * PIXEL_SIZE * PIXEL_SIZE;
                } else {
                    fill_volume += (-diff) * PIXEL_SIZE * PIXEL_SIZE;
                }
            }
        }
        if (j > 0) {
            elev2 = elevation[i*width+j-1];
            if (elev2 != NO_DATA_VALUE) {
                float diff = elev1 - elev2;
                if (diff > 0) {
                    cut_volume += diff * PIXEL_SIZE * PIXEL_SIZE;
                } else {
                    fill_volume += (-diff) * PIXEL_SIZE * PIXEL_SIZE;
                }
            }
        }
        if (j < width-1) {
            elev2 = elevation[i*width+j+1];
            if (elev2 != NO_DATA_VALUE) {
                float diff = elev1 - elev2;
                if (diff > 0) {
                    cut_volume += diff * PIXEL_SIZE * PIXEL_SIZE;
                } else {
                    fill_volume += (-diff) * PIXEL_SIZE * PIXEL_SIZE;
                }
            }
        }
    }
}

// 输出结果
printf("Fill volume = %.2f m3\n", fill_volume);
printf("Cut volume = %.2f m3\n", cut_volume);

// 释放内存空间
free(elevation);

// 关闭文件
fclose(fp_dem);

return 0;

}

可能出现“invalid file size!”的原因:

  • 文件本身存在问题: DEM文件可能损坏,导致无法正确读取文件头信息或数据。
  • 文件路径错误: 文件路径可能输入错误,导致无法找到文件。
  • 文件格式错误: 文件格式可能不符合程序预期的格式,导致无法读取数据。

解决方案:

  • 检查文件是否存在: 确保文件路径正确,并且文件存在于指定位置。
  • 检查文件格式: 确保文件格式为正确的DEM格式,例如GeoTIFF。
  • 检查文件内容: 尝试使用其他软件打开文件,查看文件内容是否完整。
  • 调试程序: 使用调试工具跟踪程序运行过程,查看程序在读取文件时是否出现异常。

如果问题仍然存在,请提供更多信息,例如文件路径、文件格式等,以便更好地定位问题。

C语言代码计算DEM文件填方挖方体积

原文地址: https://www.cveoy.top/t/topic/jn9Z 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录