六种坡度计算方法程序设计
运用以下六种坡计算方法编写坡度计算程序:
???? 实验数据: C:\Users\sy\Desktop\GRID\Ex1\DEM数据
???? 实验流程:
· 制作步骤说明
1. 栅格转文本
数据说明:
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. 算法
|
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;
}
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;
}
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;
}
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;
|
}
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;
|
}
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.算法
上方显示方法名 |
上方显示方法名 |
上方显示方法名 |
上方显示方法名 |
上方显示方法名 |
上方显示方法名 |
3.程序保存文本
输入保存文件名 |
文件保存效果 |
1.GIS程序软件用Arcengine开发会更加方便些,以后有时间会多多学习;
2.不同种类和数量的计算公式嵌入程序中可以实现不同的作用效果。
(比如,坡度公式+坡向公式+坡度变率可以算出ACSII文件中的坡度变率
而单纯多个坡度公式也可以实现算法精确度、适用范围的研究对比。)
3.一个大问题或者一项大工程,可能是由很多很多小问题或小步骤组成的,
将解决这些小问题的公式算法拼在一起,最终就可以开发出解决大问题的程序了。
实验五 六种坡度计算方法程序设计
运用以下六种坡计算方法编写坡度计算程序:
???? 实验数据: C:\Users\sy\Desktop\GRID\Ex1\DEM数据
???? 实验流程:
· 制作步骤说明
1. 栅格转文本
数据说明:
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. 算法
|
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;
}
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;
}
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;
}
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;
|
}
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;
|
}
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.算法
上方显示方法名 |
上方显示方法名 |
上方显示方法名 |
上方显示方法名 |
上方显示方法名 |
上方显示方法名 |
3.程序保存文本
输入保存文件名 |
文件保存效果 |
1.GIS程序软件用Arcengine开发会更加方便些,以后有时间会多多学习;
2.不同种类和数量的计算公式嵌入程序中可以实现不同的作用效果。
(比如,坡度公式+坡向公式+坡度变率可以算出ACSII文件中的坡度变率
而单纯多个坡度公式也可以实现算法精确度、适用范围的研究对比。)
3.一个大问题或者一项大工程,可能是由很多很多小问题或小步骤组成的,
将解决这些小问题的公式算法拼在一起,最终就可以开发出解决大问题的程序了。
实验五 六种坡度计算方法程序设计
运用以下六种坡计算方法编写坡度计算程序:
???? 实验数据: C:\Users\sy\Desktop\GRID\Ex1\DEM数据
???? 实验流程:
· 制作步骤说明
1. 栅格转文本
数据说明:
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. 算法
|
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;
}
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;
}
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;
}
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;
|
}
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;
|
}
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.算法
上方显示方法名 |
上方显示方法名 |
上方显示方法名 |
上方显示方法名 |
上方显示方法名 |
上方显示方法名 |
3.程序保存文本
输入保存文件名 |
文件保存效果 |
1.GIS程序软件用Arcengine开发会更加方便些,以后有时间会多多学习;
2.不同种类和数量的计算公式嵌入程序中可以实现不同的作用效果。
(比如,坡度公式+坡向公式+坡度变率可以算出ACSII文件中的坡度变率
而单纯多个坡度公式也可以实现算法精确度、适用范围的研究对比。)
3.一个大问题或者一项大工程,可能是由很多很多小问题或小步骤组成的,
将解决这些小问题的公式算法拼在一起,最终就可以开发出解决大问题的程序了。