DEM六种坡度计算方法程序源代码说明简单差分二阶三阶反距离平方权三阶反距离权三阶不带权边框差分

发布时间:2024年01月06日

六种坡度计算方法程序设计

  • 实验内容与目的

运用以下六种坡计算方法编写坡度计算程序:

    1. 简单差分
    2. 二阶差分
    3. 三阶反距离平方权差分
    4. 三阶反距离权差分
    5. 三阶不带权差分
    6. 边框差分
  • 实验数据与流程

???? 实验数据: C:\Users\sy\Desktop\GRID\Ex1\DEM数据

???? 实验流程:

  • 实验步骤及结果

· 制作步骤说明

1. 栅格转文本

  1. 打开ARCGIS 的Raster to ASCII工具

  1. 输入裁切后的栅格文件

  1. 生成文本文件如图

数据说明:

  1. ncols?和?nrows?表示这份数据的行列数,这份数据是486×327。
  2. xllcorner?和?yllcorner?表示的就是栅格的左下角(low left)角点的坐标。
  3. cellsize?也就是像元大小,表示每个正方形单元的尺寸,这份数据是5。

2. 程序打开文本

OpenFileDialog FileName = new OpenFileDialog();//初始化打开文件对话框

FileName.InitialDirectory = Application.StartupPath;//默认路径

FileName.Filter = "文本文件(*.txt)|*.txt"; //设置打开文件类型

FileName.FilterIndex = 2;//设置控件打开文件夹的显示顺序

FileName.RestoreDirectory = true;//设置是否记忆之前打开的目录

if (FileName.ShowDialog() == DialogResult.OK)//如果成功选择

{

string path = FileName.FileName.ToString();//获取选择文件完整路径

string Name = path.Substring(path.LastIndexOf("\\") + 1);//获取文件名

label2.Text = Name;

data1 = System.IO.File.ReadAllLines(path);//获取文本内string数组

//获取前六行信息

for (int w = 0; w < 6; w++)

{

ST = data1[w];

?? switch (w)

? ?{//正则检测数字(整数和小数区分)

? case 0:

???? ???String cols = Regex.Match(ST, "\\d+$").Value;

???? ???ncols = int.Parse(cols);//提取ncols值???????????????????????????

???? ???break;

? case 1:

????? ??String rows = Regex.Match(ST, "\\d+$").Value;

????? ??nrows = int.Parse(rows);//提取nrows值

???? ???break;

?case 4:

??????? String size = Regex.Match(ST, "\\d").Value;

?????? ?cellsize = int.Parse(size);//提取cellsize值

?????? ?break; }}

???? string[] CLO = new string[data1.Length];//定义行字符串

???? double[,] ta = new double[nrows+2, ncols+2];//元素数值

??? ?//获取六行之后的信息

char flag = ' ';// 由空格分割元素字符串

for (int j = 0; j < ncols+2; j++)

{

for (int i = 0; i < nrows+2; i++)

{ ta[i, j] = 0;????????? //给所有数值赋零

}}

for (int j= 1;j< ncols+1; j++)

{

CLO[j] = data1[j + 5];

sp = CLO[j].Split(flag);

for (int i= 1; i < nrows+1;i++)

{ta[i, j] = double.Parse(sp[i-1]);??? //在中间添加栅格高程数据

}}

dem = ta;

3. 算法

    1. 简单差分

for (int j =1;j< ncols+1; j++)

{

for (int i = 1; i < nrows+1; i++)

{

fx = (dem[i , j] - dem[i, j - 1] ) /? cellsize;

fy = (dem[i, j] - dem[i-1, j]) / cellsize;

sqt = Math.Sqrt(fx * fx + fy * fy);

slope[i - 1, j - 1] = Math.Round((Math.Atan(sqt) * 57.29578), 2);//保留两位小数

textBox1.Text += slope[i-1,j-1].ToString();

textBox1.Text += " ";

}

textBox1.Text += Environment.NewLine;

}

    1. 二阶差分

for (int j =1;j< ncols+1; j++)

{

for (int i = 1; i < nrows+1; i++)

{

fx = (dem[i+1, j] - dem[i-1, j ]) /(2* cellsize);

fy = (dem[i, j+1] - dem[i, j - 1]) /(2 * cellsize);

sqt = Math.Sqrt(fx * fx + fy * fy);

slope[i - 1, j - 1] = Math.Round((Math.Atan(sqt) * 57.29578), 2);//保留两位小数

textBox1.Text += slope[i-1,j-1].ToString();

textBox1.Text += " ";

}

textBox1.Text += Environment.NewLine;

}

    1. 三阶反距离平方权差分

for (int j =1;j< ncols+1; j++)

{

for (int i = 1; i < nrows+1; i++)

{

fx = (dem[i + 1, j - 1] - dem[i - 1, j - 1] + 2 * (dem[i + 1, j] - dem[i - 1, j]) + dem[i + 1, j + 1] - dem[i - 1, j + 1]) / (8 * cellsize);

fy = (dem[i - 1, j + 1] - dem[i - 1, j - 1] + 2 * (dem[i, j + 1] - dem[i, j - 1]) + dem[i + 1, j + 1] - dem[i + 1, j - 1]) / (8 * cellsize);

sqt = Math.Sqrt(fx * fx + fy * fy);

slope[i - 1, j - 1] = Math.Round((Math.Atan(sqt) * 57.29578), 2);//保留两位小数

textBox1.Text += slope[i-1,j-1].ToString();

textBox1.Text += " ";

}

textBox1.Text += Environment.NewLine;

}

    1. 三阶反距离权差分

for (int j =1;j< ncols+1; j++)

{

for (int i = 1; i < nrows+1; i++)

{

fx = (dem[i - 1, j + 1] - dem[i - 1, j - 1] + System.Math.Sqrt(2) * (dem[i, j + 1] - dem[i, j - 1]) + dem[i + 1, j + 1] - dem[i + 1, j - 1]) / ((4+2*System.Math.Sqrt(2)) * cellsize);

fy = (dem[i + 1, j + 1] - dem[i - 1, j + 1] + System.Math.Sqrt(2) * (dem[i + 1, j] - dem[i - 1, j]) + dem[i + 1, j - 1] - dem[i - 1, j - 1]) / ((4 + 2 * System.Math.Sqrt(2)) * cellsize);

sqt = Math.Sqrt(fx * fx + fy * fy);

slope[i - 1, j - 1] = Math.Round((Math.Atan(sqt) * 57.29578), 2);//保留两位小数

textBox1.Text += slope[i-1,j-1].ToString();

textBox1.Text += " ";

}

textBox1.Text += Environment.NewLine;

}

    1. 三阶不带权差分

for (int j =1;j< ncols+1; j++)

{

for (int i = 1; i < nrows+1; i++)

{

fx = (dem[i - 1, j + 1] - dem[i - 1, j - 1] +? dem[i, j + 1] - dem[i, j - 1] + dem[i + 1, j + 1] - dem[i + 1, j - 1]) / (6 * cellsize);

fy = (dem[i + 1, j + 1] - dem[i - 1, j - 1] +? dem[i + 1, j] - dem[i - 1, j] + dem[i + 1, j - 1] - dem[i - 1, j + 1]) / (6 * cellsize);

sqt = Math.Sqrt(fx * fx + fy * fy);

slope[i - 1, j - 1] = Math.Round((Math.Atan(sqt) * 57.29578), 2);//保留两位小数

textBox1.Text += slope[i-1,j-1].ToString();

textBox1.Text += " ";

}

textBox1.Text += Environment.NewLine;

}

    1. 边框差分

for (int j =1;j< ncols+1; j++)

{

for (int i = 1; i < nrows+1; i++)

{

fx = (dem[i - 1, j + 1] - dem[i - 1, j - 1] + dem[i + 1, j + 1] - dem[i + 1, j - 1]) / (4 * cellsize);

fy = (dem[i + 1, j - 1] - dem[i - 1, j - 1] + dem[i + 1, j + 1] - dem[i - 1, j + 1]) / (4 * cellsize);

sqt = Math.Sqrt(fx * fx + fy * fy);

slope[i - 1, j - 1] = Math.Round((Math.Atan(sqt) * 57.29578), 2);//保留两位小数

textBox1.Text += slope[i-1,j-1].ToString();

textBox1.Text += " ";

}

textBox1.Text += Environment.NewLine;

}

· 程序运行结果

1.程序打开文本

打开转换完成的ASCII文件

上方显示文件名

2.算法

  1. 简单差分

上方显示方法名

  1. 二阶差分

上方显示方法名

  1. 三阶反距离平方权差分

上方显示方法名

  1. 三阶反距离权差分

上方显示方法名

  1. 三阶不带权差分

上方显示方法名

  1. 边框差分

上方显示方法名

3.程序保存文本

输入保存文件名

文件保存效果

  • 实验心得体会

1.GIS程序软件用Arcengine开发会更加方便些,以后有时间会多多学习;

2.不同种类和数量的计算公式嵌入程序中可以实现不同的作用效果。

(比如,坡度公式+坡向公式+坡度变率可以算出ACSII文件中的坡度变率

而单纯多个坡度公式也可以实现算法精确度、适用范围的研究对比。)

3.一个大问题或者一项大工程,可能是由很多很多小问题或小步骤组成的,

将解决这些小问题的公式算法拼在一起,最终就可以开发出解决大问题的程序了。

实验五 六种坡度计算方法程序设计

  • 实验内容与目的

运用以下六种坡计算方法编写坡度计算程序:

    1. 简单差分
    2. 二阶差分
    3. 三阶反距离平方权差分
    4. 三阶反距离权差分
    5. 三阶不带权差分
    6. 边框差分
  • 实验数据与流程

???? 实验数据: C:\Users\sy\Desktop\GRID\Ex1\DEM数据

???? 实验流程:

  • 实验步骤及结果

· 制作步骤说明

1. 栅格转文本

  1. 打开ARCGIS 的Raster to ASCII工具

  1. 输入裁切后的栅格文件

  1. 生成文本文件如图

数据说明:

  1. ncols?和?nrows?表示这份数据的行列数,这份数据是486×327。
  2. xllcorner?和?yllcorner?表示的就是栅格的左下角(low left)角点的坐标。
  3. cellsize?也就是像元大小,表示每个正方形单元的尺寸,这份数据是5。

2. 程序打开文本

OpenFileDialog FileName = new OpenFileDialog();//初始化打开文件对话框

FileName.InitialDirectory = Application.StartupPath;//默认路径

FileName.Filter = "文本文件(*.txt)|*.txt"; //设置打开文件类型

FileName.FilterIndex = 2;//设置控件打开文件夹的显示顺序

FileName.RestoreDirectory = true;//设置是否记忆之前打开的目录

if (FileName.ShowDialog() == DialogResult.OK)//如果成功选择

{

string path = FileName.FileName.ToString();//获取选择文件完整路径

string Name = path.Substring(path.LastIndexOf("\\") + 1);//获取文件名

label2.Text = Name;

data1 = System.IO.File.ReadAllLines(path);//获取文本内string数组

//获取前六行信息

for (int w = 0; w < 6; w++)

{

ST = data1[w];

?? switch (w)

? ?{//正则检测数字(整数和小数区分)

? case 0:

???? ???String cols = Regex.Match(ST, "\\d+$").Value;

???? ???ncols = int.Parse(cols);//提取ncols值???????????????????????????

???? ???break;

? case 1:

????? ??String rows = Regex.Match(ST, "\\d+$").Value;

????? ??nrows = int.Parse(rows);//提取nrows值

???? ???break;

?case 4:

??????? String size = Regex.Match(ST, "\\d").Value;

?????? ?cellsize = int.Parse(size);//提取cellsize值

?????? ?break; }}

???? string[] CLO = new string[data1.Length];//定义行字符串

???? double[,] ta = new double[nrows+2, ncols+2];//元素数值

??? ?//获取六行之后的信息

char flag = ' ';// 由空格分割元素字符串

for (int j = 0; j < ncols+2; j++)

{

for (int i = 0; i < nrows+2; i++)

{ ta[i, j] = 0;????????? //给所有数值赋零

}}

for (int j= 1;j< ncols+1; j++)

{

CLO[j] = data1[j + 5];

sp = CLO[j].Split(flag);

for (int i= 1; i < nrows+1;i++)

{ta[i, j] = double.Parse(sp[i-1]);??? //在中间添加栅格高程数据

}}

dem = ta;

3. 算法

    1. 简单差分

for (int j =1;j< ncols+1; j++)

{

for (int i = 1; i < nrows+1; i++)

{

fx = (dem[i , j] - dem[i, j - 1] ) /? cellsize;

fy = (dem[i, j] - dem[i-1, j]) / cellsize;

sqt = Math.Sqrt(fx * fx + fy * fy);

slope[i - 1, j - 1] = Math.Round((Math.Atan(sqt) * 57.29578), 2);//保留两位小数

textBox1.Text += slope[i-1,j-1].ToString();

textBox1.Text += " ";

}

textBox1.Text += Environment.NewLine;

}

    1. 二阶差分

for (int j =1;j< ncols+1; j++)

{

for (int i = 1; i < nrows+1; i++)

{

fx = (dem[i+1, j] - dem[i-1, j ]) /(2* cellsize);

fy = (dem[i, j+1] - dem[i, j - 1]) /(2 * cellsize);

sqt = Math.Sqrt(fx * fx + fy * fy);

slope[i - 1, j - 1] = Math.Round((Math.Atan(sqt) * 57.29578), 2);//保留两位小数

textBox1.Text += slope[i-1,j-1].ToString();

textBox1.Text += " ";

}

textBox1.Text += Environment.NewLine;

}

    1. 三阶反距离平方权差分

for (int j =1;j< ncols+1; j++)

{

for (int i = 1; i < nrows+1; i++)

{

fx = (dem[i + 1, j - 1] - dem[i - 1, j - 1] + 2 * (dem[i + 1, j] - dem[i - 1, j]) + dem[i + 1, j + 1] - dem[i - 1, j + 1]) / (8 * cellsize);

fy = (dem[i - 1, j + 1] - dem[i - 1, j - 1] + 2 * (dem[i, j + 1] - dem[i, j - 1]) + dem[i + 1, j + 1] - dem[i + 1, j - 1]) / (8 * cellsize);

sqt = Math.Sqrt(fx * fx + fy * fy);

slope[i - 1, j - 1] = Math.Round((Math.Atan(sqt) * 57.29578), 2);//保留两位小数

textBox1.Text += slope[i-1,j-1].ToString();

textBox1.Text += " ";

}

textBox1.Text += Environment.NewLine;

}

    1. 三阶反距离权差分

for (int j =1;j< ncols+1; j++)

{

for (int i = 1; i < nrows+1; i++)

{

fx = (dem[i - 1, j + 1] - dem[i - 1, j - 1] + System.Math.Sqrt(2) * (dem[i, j + 1] - dem[i, j - 1]) + dem[i + 1, j + 1] - dem[i + 1, j - 1]) / ((4+2*System.Math.Sqrt(2)) * cellsize);

fy = (dem[i + 1, j + 1] - dem[i - 1, j + 1] + System.Math.Sqrt(2) * (dem[i + 1, j] - dem[i - 1, j]) + dem[i + 1, j - 1] - dem[i - 1, j - 1]) / ((4 + 2 * System.Math.Sqrt(2)) * cellsize);

sqt = Math.Sqrt(fx * fx + fy * fy);

slope[i - 1, j - 1] = Math.Round((Math.Atan(sqt) * 57.29578), 2);//保留两位小数

textBox1.Text += slope[i-1,j-1].ToString();

textBox1.Text += " ";

}

textBox1.Text += Environment.NewLine;

}

    1. 三阶不带权差分

for (int j =1;j< ncols+1; j++)

{

for (int i = 1; i < nrows+1; i++)

{

fx = (dem[i - 1, j + 1] - dem[i - 1, j - 1] +? dem[i, j + 1] - dem[i, j - 1] + dem[i + 1, j + 1] - dem[i + 1, j - 1]) / (6 * cellsize);

fy = (dem[i + 1, j + 1] - dem[i - 1, j - 1] +? dem[i + 1, j] - dem[i - 1, j] + dem[i + 1, j - 1] - dem[i - 1, j + 1]) / (6 * cellsize);

sqt = Math.Sqrt(fx * fx + fy * fy);

slope[i - 1, j - 1] = Math.Round((Math.Atan(sqt) * 57.29578), 2);//保留两位小数

textBox1.Text += slope[i-1,j-1].ToString();

textBox1.Text += " ";

}

textBox1.Text += Environment.NewLine;

}

    1. 边框差分

for (int j =1;j< ncols+1; j++)

{

for (int i = 1; i < nrows+1; i++)

{

fx = (dem[i - 1, j + 1] - dem[i - 1, j - 1] + dem[i + 1, j + 1] - dem[i + 1, j - 1]) / (4 * cellsize);

fy = (dem[i + 1, j - 1] - dem[i - 1, j - 1] + dem[i + 1, j + 1] - dem[i - 1, j + 1]) / (4 * cellsize);

sqt = Math.Sqrt(fx * fx + fy * fy);

slope[i - 1, j - 1] = Math.Round((Math.Atan(sqt) * 57.29578), 2);//保留两位小数

textBox1.Text += slope[i-1,j-1].ToString();

textBox1.Text += " ";

}

textBox1.Text += Environment.NewLine;

}

· 程序运行结果

1.程序打开文本

打开转换完成的ASCII文件

上方显示文件名

2.算法

  1. 简单差分

上方显示方法名

  1. 二阶差分

上方显示方法名

  1. 三阶反距离平方权差分

上方显示方法名

  1. 三阶反距离权差分

上方显示方法名

  1. 三阶不带权差分

上方显示方法名

  1. 边框差分

上方显示方法名

3.程序保存文本

输入保存文件名

文件保存效果

  • 实验心得体会

1.GIS程序软件用Arcengine开发会更加方便些,以后有时间会多多学习;

2.不同种类和数量的计算公式嵌入程序中可以实现不同的作用效果。

(比如,坡度公式+坡向公式+坡度变率可以算出ACSII文件中的坡度变率

而单纯多个坡度公式也可以实现算法精确度、适用范围的研究对比。)

3.一个大问题或者一项大工程,可能是由很多很多小问题或小步骤组成的,

将解决这些小问题的公式算法拼在一起,最终就可以开发出解决大问题的程序了。

实验五 六种坡度计算方法程序设计

  • 实验内容与目的

运用以下六种坡计算方法编写坡度计算程序:

    1. 简单差分
    2. 二阶差分
    3. 三阶反距离平方权差分
    4. 三阶反距离权差分
    5. 三阶不带权差分
    6. 边框差分
  • 实验数据与流程

???? 实验数据: C:\Users\sy\Desktop\GRID\Ex1\DEM数据

???? 实验流程:

  • 实验步骤及结果

· 制作步骤说明

1. 栅格转文本

  1. 打开ARCGIS 的Raster to ASCII工具

  1. 输入裁切后的栅格文件

  1. 生成文本文件如图

数据说明:

  1. ncols?和?nrows?表示这份数据的行列数,这份数据是486×327。
  2. xllcorner?和?yllcorner?表示的就是栅格的左下角(low left)角点的坐标。
  3. cellsize?也就是像元大小,表示每个正方形单元的尺寸,这份数据是5。

2. 程序打开文本

OpenFileDialog FileName = new OpenFileDialog();//初始化打开文件对话框

FileName.InitialDirectory = Application.StartupPath;//默认路径

FileName.Filter = "文本文件(*.txt)|*.txt"; //设置打开文件类型

FileName.FilterIndex = 2;//设置控件打开文件夹的显示顺序

FileName.RestoreDirectory = true;//设置是否记忆之前打开的目录

if (FileName.ShowDialog() == DialogResult.OK)//如果成功选择

{

string path = FileName.FileName.ToString();//获取选择文件完整路径

string Name = path.Substring(path.LastIndexOf("\\") + 1);//获取文件名

label2.Text = Name;

data1 = System.IO.File.ReadAllLines(path);//获取文本内string数组

//获取前六行信息

for (int w = 0; w < 6; w++)

{

ST = data1[w];

?? switch (w)

? ?{//正则检测数字(整数和小数区分)

? case 0:

???? ???String cols = Regex.Match(ST, "\\d+$").Value;

???? ???ncols = int.Parse(cols);//提取ncols值???????????????????????????

???? ???break;

? case 1:

????? ??String rows = Regex.Match(ST, "\\d+$").Value;

????? ??nrows = int.Parse(rows);//提取nrows值

???? ???break;

?case 4:

??????? String size = Regex.Match(ST, "\\d").Value;

?????? ?cellsize = int.Parse(size);//提取cellsize值

?????? ?break; }}

???? string[] CLO = new string[data1.Length];//定义行字符串

???? double[,] ta = new double[nrows+2, ncols+2];//元素数值

??? ?//获取六行之后的信息

char flag = ' ';// 由空格分割元素字符串

for (int j = 0; j < ncols+2; j++)

{

for (int i = 0; i < nrows+2; i++)

{ ta[i, j] = 0;????????? //给所有数值赋零

}}

for (int j= 1;j< ncols+1; j++)

{

CLO[j] = data1[j + 5];

sp = CLO[j].Split(flag);

for (int i= 1; i < nrows+1;i++)

{ta[i, j] = double.Parse(sp[i-1]);??? //在中间添加栅格高程数据

}}

dem = ta;

3. 算法

    1. 简单差分

for (int j =1;j< ncols+1; j++)

{

for (int i = 1; i < nrows+1; i++)

{

fx = (dem[i , j] - dem[i, j - 1] ) /? cellsize;

fy = (dem[i, j] - dem[i-1, j]) / cellsize;

sqt = Math.Sqrt(fx * fx + fy * fy);

slope[i - 1, j - 1] = Math.Round((Math.Atan(sqt) * 57.29578), 2);//保留两位小数

textBox1.Text += slope[i-1,j-1].ToString();

textBox1.Text += " ";

}

textBox1.Text += Environment.NewLine;

}

    1. 二阶差分

for (int j =1;j< ncols+1; j++)

{

for (int i = 1; i < nrows+1; i++)

{

fx = (dem[i+1, j] - dem[i-1, j ]) /(2* cellsize);

fy = (dem[i, j+1] - dem[i, j - 1]) /(2 * cellsize);

sqt = Math.Sqrt(fx * fx + fy * fy);

slope[i - 1, j - 1] = Math.Round((Math.Atan(sqt) * 57.29578), 2);//保留两位小数

textBox1.Text += slope[i-1,j-1].ToString();

textBox1.Text += " ";

}

textBox1.Text += Environment.NewLine;

}

    1. 三阶反距离平方权差分

for (int j =1;j< ncols+1; j++)

{

for (int i = 1; i < nrows+1; i++)

{

fx = (dem[i + 1, j - 1] - dem[i - 1, j - 1] + 2 * (dem[i + 1, j] - dem[i - 1, j]) + dem[i + 1, j + 1] - dem[i - 1, j + 1]) / (8 * cellsize);

fy = (dem[i - 1, j + 1] - dem[i - 1, j - 1] + 2 * (dem[i, j + 1] - dem[i, j - 1]) + dem[i + 1, j + 1] - dem[i + 1, j - 1]) / (8 * cellsize);

sqt = Math.Sqrt(fx * fx + fy * fy);

slope[i - 1, j - 1] = Math.Round((Math.Atan(sqt) * 57.29578), 2);//保留两位小数

textBox1.Text += slope[i-1,j-1].ToString();

textBox1.Text += " ";

}

textBox1.Text += Environment.NewLine;

}

    1. 三阶反距离权差分

for (int j =1;j< ncols+1; j++)

{

for (int i = 1; i < nrows+1; i++)

{

fx = (dem[i - 1, j + 1] - dem[i - 1, j - 1] + System.Math.Sqrt(2) * (dem[i, j + 1] - dem[i, j - 1]) + dem[i + 1, j + 1] - dem[i + 1, j - 1]) / ((4+2*System.Math.Sqrt(2)) * cellsize);

fy = (dem[i + 1, j + 1] - dem[i - 1, j + 1] + System.Math.Sqrt(2) * (dem[i + 1, j] - dem[i - 1, j]) + dem[i + 1, j - 1] - dem[i - 1, j - 1]) / ((4 + 2 * System.Math.Sqrt(2)) * cellsize);

sqt = Math.Sqrt(fx * fx + fy * fy);

slope[i - 1, j - 1] = Math.Round((Math.Atan(sqt) * 57.29578), 2);//保留两位小数

textBox1.Text += slope[i-1,j-1].ToString();

textBox1.Text += " ";

}

textBox1.Text += Environment.NewLine;

}

    1. 三阶不带权差分

for (int j =1;j< ncols+1; j++)

{

for (int i = 1; i < nrows+1; i++)

{

fx = (dem[i - 1, j + 1] - dem[i - 1, j - 1] +? dem[i, j + 1] - dem[i, j - 1] + dem[i + 1, j + 1] - dem[i + 1, j - 1]) / (6 * cellsize);

fy = (dem[i + 1, j + 1] - dem[i - 1, j - 1] +? dem[i + 1, j] - dem[i - 1, j] + dem[i + 1, j - 1] - dem[i - 1, j + 1]) / (6 * cellsize);

sqt = Math.Sqrt(fx * fx + fy * fy);

slope[i - 1, j - 1] = Math.Round((Math.Atan(sqt) * 57.29578), 2);//保留两位小数

textBox1.Text += slope[i-1,j-1].ToString();

textBox1.Text += " ";

}

textBox1.Text += Environment.NewLine;

}

    1. 边框差分

for (int j =1;j< ncols+1; j++)

{

for (int i = 1; i < nrows+1; i++)

{

fx = (dem[i - 1, j + 1] - dem[i - 1, j - 1] + dem[i + 1, j + 1] - dem[i + 1, j - 1]) / (4 * cellsize);

fy = (dem[i + 1, j - 1] - dem[i - 1, j - 1] + dem[i + 1, j + 1] - dem[i - 1, j + 1]) / (4 * cellsize);

sqt = Math.Sqrt(fx * fx + fy * fy);

slope[i - 1, j - 1] = Math.Round((Math.Atan(sqt) * 57.29578), 2);//保留两位小数

textBox1.Text += slope[i-1,j-1].ToString();

textBox1.Text += " ";

}

textBox1.Text += Environment.NewLine;

}

· 程序运行结果

1.程序打开文本

打开转换完成的ASCII文件

上方显示文件名

2.算法

  1. 简单差分

上方显示方法名

  1. 二阶差分

上方显示方法名

  1. 三阶反距离平方权差分

上方显示方法名

  1. 三阶反距离权差分

上方显示方法名

  1. 三阶不带权差分

上方显示方法名

  1. 边框差分

上方显示方法名

3.程序保存文本

输入保存文件名

文件保存效果

  • 实验心得体会

1.GIS程序软件用Arcengine开发会更加方便些,以后有时间会多多学习;

2.不同种类和数量的计算公式嵌入程序中可以实现不同的作用效果。

(比如,坡度公式+坡向公式+坡度变率可以算出ACSII文件中的坡度变率

而单纯多个坡度公式也可以实现算法精确度、适用范围的研究对比。)

3.一个大问题或者一项大工程,可能是由很多很多小问题或小步骤组成的,

将解决这些小问题的公式算法拼在一起,最终就可以开发出解决大问题的程序了。

文章来源:https://blog.csdn.net/yushibing717/article/details/135376832
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。