#define _CRT_SECURE_NO_DEPRECATE #include <stdio.h> #include <stdlib.h> #include <sys/stat.h>

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

int main() { FILE* fp_dem; const char* filename = "D:\kjfx\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!

", 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文件大小
struct stat st;
if (stat(filename, &st) == 0) {
    long filesize = st.st_size;
    long datasize = filesize - 0x44;

    // 检查文件大小是否符合要求
    if (datasize % sizeof(float) != 0 || datasize / sizeof(float) != width * height) {
        printf("Error: invalid file size!

"); fclose(fp_dem); return 1; }

    // 分配内存空间
    elevation = (float*)malloc(datasize);
    if (elevation == NULL) {
        printf("Error: cannot allocate memory!

"); fclose(fp_dem); return 1; }

    // 读取DEM.tif数据
    fseek(fp_dem, 0x44, SEEK_SET);
    size_t n = fread(elevation, sizeof(float), datasize / sizeof(float), fp_dem);
    if (n != datasize / sizeof(float)) {
        printf("Error: cannot read file!

"); free(elevation); fclose(fp_dem); return 1; } } else { printf("Error: cannot get file size! "); return 1; }

// 遍历像素值,计算填方和挖方的体积
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怎么改正内容:出现 'invalid file size' 的错误提示,说明读取的文件大小与预期不符合,需要检查代码中的文件大小计算是否正确。可以尝试以下修改:

// 1. 将计算文件大小的代码移到文件头信息读取之前,避免计算错误; // 2. 在文件大小计算之后,添加一个判断语句,检查文件大小是否符合要求; // 3. 如果文件大小不符合要求,可以尝试使用其他方式读取文件,例如 GDAL 库。

// 具体修改方式可以参考以下代码示例:

// 计算DEM.tif文件大小
struct stat st;
// ... 文件头信息读取
// ...
if (stat(filename, &st) == 0) {
    long filesize = st.st_size;
    long datasize = filesize - 0x44;

    // 检查文件大小是否符合要求
    if (datasize % sizeof(float) != 0 || datasize / sizeof(float) != width * height) {
        printf("Error: invalid file size!
");
        free(elevation);
        fclose(fp_dem);
        return 1;
    }

    // 分配内存空间
    elevation = (float*)malloc(datasize);
    if (elevation == NULL) {
        printf("Error: cannot allocate memory!
");
        fclose(fp_dem);
        return 1;
    }

    // 读取DEM.tif数据
    fseek(fp_dem, 0x44, SEEK_SET);
    size_t n = fread(elevation, sizeof(float), datasize / sizeof(float), fp_dem);
    if (n != datasize / sizeof(float)) {
        printf("Error: cannot read file!
");
        free(elevation);
        fclose(fp_dem);
        return 1;
    }
}
// ... 剩余代码
C语言计算DEM文件填挖方体积:代码示例与优化建议

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

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