c语言实现读取并计算已知demtif数据的填方挖方不用gdal库
读取并计算DEM.tif数据的填方挖方,可以使用以下步骤:
-
打开DEM.tif文件,读取其像素值。
-
遍历像素值,计算每个像素的高度差。
-
根据高度差和像素大小,计算填方和挖方的体积。
-
对所有像素的填方和挖方体积求和,得到总的填方和挖方体积。
下面是一个简单的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数据
原文地址: https://www.cveoy.top/t/topic/fsnc 著作权归作者所有。请勿转载和采集!