读取并计算DEM.tif数据的填方挖方,可以使用以下步骤:

  1. 打开DEM.tif文件,读取其像素值。

  2. 遍历像素值,计算每个像素的高度差。

  3. 根据高度差和像素大小,计算填方和挖方的体积。

  4. 对所有像素的填方和挖方体积求和,得到总的填方和挖方体积。

下面是一个简单的C语言代码示例,可以实现以上步骤:

#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;
}

注意:以上代码仅供参考,可能需要根据实际情况进行修改。另外,该代码只适用于标准的GeoTIFF格式,不适用于其他格式的DEM数据

c语言实现读取并计算已知demtif数据的填方挖方不用gdal库

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

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