C语言计算DEM.tif填方挖方体积
#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;
}
else {
printf('Error: cannot get file size!
'); return 1; } long datasize = st.st_size - 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; }
// 遍历像素值,计算填方和挖方的体积
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.tif 文件,确保文件大小和数据格式正确。如果问题仍然存在,可以检查代码中读取文件大小和数据大小的逻辑是否正确,或者尝试使用其他工具检查 DEM.tif 文件是否有效。
原文地址: https://www.cveoy.top/t/topic/joaa 著作权归作者所有。请勿转载和采集!