基于DEM的坡向计算原理(自用学习)

坡向是一个角度,将按照顺时针方向进行测量,角度范围介于 0(正东)到 360(仍是正东)之间,即完整的圆。

先定义一个3×3的像元窗口,这个窗口是会逐像元的移动,(边跑边计算,直至把所有像元都算过一遍)。

而每次位于窗口中心的像元的坡向值将通过一种将纳入八个相邻像元值的算法进行计算。这些像元使用字母 a 至 i 进行确定,其中 e 表示当前正在计算坡向的像元。(通俗讲:就是中间像元和他周围的每一个像元都要算一下)

像元 e 在 x 方向上的变化率将通过以下算法进行计算:

  [dz/dx] = ((c + 2f + i) - (a + 2d + g)) / 8

像元 e 在 y 方向上的变化率将通过以下算法进行计算:

  [dz/dy] = ((g + 2h + i) - (a + 2b + c)) / 8

代入像元 e 在 x 方向和 y 方向上的变化率,坡向将通过以下算法进行计算:

  aspect(坡向) = 57.29578 * atan2 ([dz/dy], -[dz/dx])

然后,坡向值将根据以下规则转换为罗盘方向值(0 到 360 度):

  if aspect < 0 
    cell = 90.0 - aspect 
  else if aspect > 90.0  
    cell = 360.0 - aspect + 90.0  
  else   
    cell = 90.0 - aspect

参考链接:

​​​​​​​基于DEM的坡度坡向分析_洛蕾的博客-CSDN博客

Desktop Help 10.0 - 坡向工具的工作原理 (arcgis.com)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于DEM数据计算挖方量的C++代码示例: ```c++ #include <iostream> #include <fstream> #include <string> #include <cmath> using namespace std; // 读取DEM数据 void readDEMData(double** demData, const string& demFileName, const int& numRows, const int& numCols) { ifstream inFile(demFileName.c_str(), ios::in | ios::binary); if (!inFile) { cout << "无法打开DEM文件!" << endl; exit(1); } for (int i = 0; i < numRows; i++) { for (int j = 0; j < numCols; j++) { inFile.read((char*)&demData[i][j], sizeof(double)); } } inFile.close(); } // 计算挖方量 double calculateExcavationVolume(double** demData, const int& numRows, const int& numCols, const double& cellSize, const double& baseHeight) { double excavationVolume = 0.0; for (int i = 0; i < numRows - 1; i++) { for (int j = 0; j < numCols - 1; j++) { double height1 = demData[i][j] - baseHeight; double height2 = demData[i+1][j] - baseHeight; double height3 = demData[i+1][j+1] - baseHeight; double height4 = demData[i][j+1] - baseHeight; double avgHeight = (height1 + height2 + height3 + height4) / 4.0; double cellVolume = cellSize * cellSize * avgHeight; excavationVolume += cellVolume; } } return excavationVolume; } int main() { string demFileName = "dem.bin"; int numRows = 1000; int numCols = 1000; double cellSize = 1.0; double baseHeight = 0.0; // 分配DEM数据空间 double** demData = new double*[numRows]; for (int i = 0; i < numRows; i++) { demData[i] = new double[numCols]; } // 读取DEM数据 readDEMData(demData, demFileName, numRows, numCols); // 计算挖方量 double excavationVolume = calculateExcavationVolume(demData, numRows, numCols, cellSize, baseHeight); cout << "挖方量为:" << excavationVolume << " 立方米" << endl; // 释放DEM数据空间 for (int i = 0; i < numRows; i++) { delete[] demData[i]; } delete[] demData; return 0; } ``` 其中,`dem.bin` 文件是以二进制格式存储的 DEM 数据文件,`numRows` 和 `numCols` 分别是 DEM 数据的行列数,`cellSize` 是 DEM 数据的单元大小,`baseHeight` 是计算基准高度(一般为原地面高程)。`readDEMData` 函数用于读取 DEM 数据,`calculateExcavationVolume` 函数用于计算挖方量。最后输出计算结果。注意,此代码仅供参考,实际使用中需根据实际情况进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值