利用C#编写一个水准测量近似平差程序
一、代碼界面展示
整個界面主要就是就整個界面而言,其實主要使用到的控件就是Menu,tabControl,dataGridView,richtextbox。
二、代碼運算結果展示
1.導入數據
這里就是把txt的數據導入到程序里,數據的來源是去峨眉山實習,測了幾圈峨秀湖獲得的(往返3次,一共6圈,人都麻了)。txt文件的里面的數據要和表格里面的位置對應。
手動輸入數據那個比較雞肋,就是輸進去了再保存成txt,再導入,圖一樂,不如直接在txt中輸入。
2.參數設置
我這里直接就內置了我們實習測量時候的測站設置。限差這些可以自己修改,沒啥難度(就是幾個if語句)
3.計算數據
參數設置之后計算數據
數據如果超限,會依次彈窗出來提示,因為實驗的數據已經是經過修改的,所以沒有彈窗提醒。
源代碼中有相關的代碼
4.生成外業觀測手簿
這里我就沒有用表格了,因為我用datagridview也設計不來,能力有限,有興趣你自己可以試一試。就按照手簿的樣子,在richtextbox上面輸出出來。大致位置是一樣的,格式看著有一點點奇怪,但是絕對夠看了。
5.生成高程配賦表
這里也是用的richtextbox,一圈6km,測6次,麻了。
6.重置
這沒什么好說的了,就是把數據,界面重置了。
7.保存
把計算出的外業觀測手簿和高程配賦表導出成txt。
三、源代碼
變量設置
namespace work {class Shuju{public double sumh = 0, suml = 0;public string qhsjc;//前后視距差public string sjljc;//視距累積差public string hhmdsc;//紅黑面讀數差public string hhmgczc;//紅黑面高差之差public string [] dh;//點號public string [] czs;//測站數public string qd;//起始點高程public string zd;//重點高程public string czbh;//測站編號public double hcs;//后視上絲 public double qcs; //前視上絲 public double hcx;//后視下絲public double qcx;//前視下絲public double hchmzs1;//后尺黑面中絲public double hchmzs2;//后尺紅面中絲 public double qchmzs1;//前尺黑面中絲 public double qchmzs2;//前尺紅面中絲public double fh;//閉合差public double zjl;//總距離public double hj;//后距public double qj;//前距//public double qjjhjp;public double sjc;//視距差public double sjch;//視距差和public double hjq1;//后尺黑面中絲-前尺黑面中絲public double hjq2;//后尺紅面中絲-前尺紅面中絲public double hjq11;//后尺黑面中絲-前尺黑面中絲public double hjq12;//后尺紅面中絲-前尺紅面中絲public double kjhjh1;//K+黑減紅 后尺public double kjhjh2;//K+黑減紅 前尺public double kjhjh3;//1與2之差public double gczs;//高程中數public double gc;//高程public double dhgc;//點號高程public double jl;//距離public double pjgc;//平均高程public double gzs;//改正數public double gzhgc;//改正后高程public bool bd=false;//判斷} }Form1
namespace work {public partial class Form1 : Form{List<Shuju> sj = new List<Shuju>();Shuju shuju = new Shuju();Form2 form2 = new Form2();public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){}private void 文件ToolStripMenuItem_Click(object sender, EventArgs e){}private void 導入原始數據ToolStripMenuItem_Click(object sender, EventArgs e){string[] temp;OpenFileDialog ofd = new OpenFileDialog();ofd.Filter = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*";ofd.Title = "打開數據文件";if (ofd.ShowDialog(this) == DialogResult.OK){StreamReader sr = new StreamReader(ofd.FileName);while (!sr.EndOfStream){temp = sr.ReadLine().Split(new[] { ' ', ',', '.', ':' , ' ' },StringSplitOptions.RemoveEmptyEntries);Shuju shuju = new Shuju();shuju.czbh = temp[0];shuju.hcs = Convert.ToDouble(temp[1]);shuju.qcs = Convert.ToDouble(temp[2]);shuju.hcx = Convert.ToDouble(temp[3]);shuju.qcx = Convert.ToDouble(temp[4]);shuju.hchmzs1 = Convert.ToDouble(temp[5]);shuju.hchmzs2 = Convert.ToDouble(temp[6]);shuju.qchmzs1 = Convert.ToDouble(temp[7]);shuju.qchmzs2 = Convert.ToDouble(temp[8]);sj.Add(shuju); }sr.Close();GridBuild1(); }else{MessageBox.Show("輸入失敗");}}//獲取數據public void GridBuild1(){for (int i = 0; i < sj.Count; i++){dataGridView1.Rows.Add();dataGridView1.Rows[i].Cells[0].Value = sj[i].czbh;dataGridView1.Rows[i].Cells[1].Value = sj[i].hcs;dataGridView1.Rows[i].Cells[2].Value = sj[i].qcs;dataGridView1.Rows[i].Cells[3].Value = sj[i].hcx;dataGridView1.Rows[i].Cells[4].Value = sj[i].qcx;dataGridView1.Rows[i].Cells[5].Value = sj[i].hchmzs1;dataGridView1.Rows[i].Cells[6].Value = sj[i].hchmzs2;dataGridView1.Rows[i].Cells[7].Value = sj[i].qchmzs1;dataGridView1.Rows[i].Cells[8].Value = sj[i].qchmzs2;}}private void 參數設置ToolStripMenuItem_Click(object sender, EventArgs e){shuju.bd = true;CSSZ();}public void CSSZ(){Form2 form2 = new Form2();form2.ShowDialog();shuju.qd = form2.textBox4.Text;shuju.zd = form2.textBox5.Text;string a = form2.textBox1.Text;shuju.dh = a.Split(new Char[] { ' ', ',', '.', ':' });string b = form2.textBox3.Text;shuju.czs = b.Split(new Char[] { ' ', ',', '.', ':' });shuju.qhsjc = form2.textBox6.Text;shuju.sjljc = form2.textBox7.Text;shuju.hhmdsc = form2.textBox8.Text;shuju.hhmgczc = form2.textBox9.Text;}//參數設置private void 計算ToolStripMenuItem_Click_1(object sender, EventArgs e){if (shuju.bd==false){MessageBox.Show("請輸入參數");}else{Gcsb();Gcpfb();}}public void Gcsb(){//計算前后距for (int j = 0; j < sj.Count; j++){sj[j].hj = (sj[j].hcs - sj[j].hcx) / 10;//計算后距sj[j].qj = (sj[j].qcs - sj[j].qcx) / 10;//計算前距//sj[j].qjjhjp = sj[j].hj + sj[j].hj;sj[j].sjc = sj[j].hj - sj[j].qj;//計算視距差if (sj[j].sjc >Convert.ToInt32(shuju.qhsjc)){MessageBox.Show("前后視距差超限");break;}//計算視距差和if (j == 0){sj[j].sjch = sj[j].sjc;}else{sj[j].sjch = sj[j - 1].sjch + sj[j].sjc;if (sj[j].sjch > Convert.ToInt32(shuju.sjljc)){MessageBox.Show("前后視距差累積和超限");break;}}}//計算高差//計算K+黑減紅for (int i = 0; i < sj.Count; i++){double k1 = 4687;double k2 = 4787;if (Math.Abs(sj[0].hchmzs1 + k1 - sj[0].hchmzs2) < Math.Abs(sj[0].hchmzs1 + k2 - sj[0].hchmzs2)){if (i % 2 == 0){sj[i].kjhjh1 = sj[i].hchmzs1 + k1 - sj[i].hchmzs2;sj[i].kjhjh2 = sj[i].qchmzs1 + k2 - sj[i].qchmzs2;}else if (i % 2 == 1){sj[i].kjhjh1 = sj[i].hchmzs1 + k2 - sj[i].hchmzs2;sj[i].kjhjh2 = sj[i].qchmzs1 + k1 - sj[i].qchmzs2;}}else{if (i % 2 == 0){sj[i].kjhjh1 = sj[i].hchmzs1 + k2 - sj[i].hchmzs2;sj[i].kjhjh2 = sj[i].qchmzs1 + k1 - sj[i].qchmzs2;}else if (i % 2 == 1){sj[i].kjhjh1 = sj[i].hchmzs1 + k1 - sj[i].hchmzs2;sj[i].kjhjh2 = sj[i].qchmzs1 + k2 - sj[i].qchmzs2;}}if (Math.Abs( sj[i].kjhjh1)>3|| Math.Abs(sj[i].kjhjh2) >3){MessageBox.Show("第" + sj[i].czbh + "號測站紅黑面讀數差超限");}sj[i].hjq11 = (sj[i].hchmzs1 - sj[i].qchmzs1);sj[i].hjq12 = (sj[i].hchmzs2 - sj[i].qchmzs2);sj[i].hjq1 = (sj[i].hchmzs1 - sj[i].qchmzs1) / 1000;sj[i].hjq2 = (sj[i].hchmzs2 - sj[i].qchmzs2) / 1000;//計算高差中數sj[i].kjhjh3 = sj[i].kjhjh1 - sj[i].kjhjh2;if (sj[i].kjhjh3 > Convert .ToInt32(shuju.hhmgczc) || sj[i].kjhjh3 < -(Convert.ToInt32(shuju.hhmgczc))){MessageBox.Show("第" + sj[i].czbh + "號測站紅黑面讀數差之差超限");}if (sj[i].hjq1 > sj[i].hjq2){sj[i].gczs = (sj[i].hjq1 + sj[i].hjq2 + 0.1) / 2;}else if (sj[i].hjq1 < sj[i].hjq2){sj[i].gczs = (sj[i].hjq1 + sj[i].hjq2 - 0.1) / 2;}else{sj[i].gczs = (sj[i].hjq1 + sj[i].hjq2) / 2;}shuju.sumh += sj[i].gczs;}//計算高for (int i = 0; i < sj.Count; i++){if (i == 0){sj[i].gc = Convert.ToDouble(shuju.qd) + sj[i].gczs;}else{sj[i].gc = sj[i - 1].gc + sj[i].gczs;}}GridBuild2();}//外業觀測手簿public void Gcpfb()//高程誤差配賦表{//計算兩點距離//計算平均高差 if (sj.Count == 0){MessageBox.Show("請輸入數據");}else{int b = 0;int c = 0;for (int a = 0; a < shuju.czs.Length; a++){if (a == 0){b = Convert.ToInt32(shuju.czs[a]);for (int i = c; i < b; i++){sj[a].jl += sj[i].hj + sj[i].qj;sj[a].pjgc += sj[i].gczs;sj[a].gzs = -(sj[i].jl / shuju.zjl) * shuju.fh;sj[a].gzhgc = sj[i].pjgc + sj[i].gzs;}}else{b += Convert.ToInt32(shuju.czs[a]);c += Convert.ToInt32(shuju.czs[a - 1]);for (int i = c; i < b; i++){sj[a].jl += sj[i].hj + sj[i].qj;sj[a].pjgc += sj[i].gczs;sj[a].gzs = -(sj[i].jl / shuju.zjl) * shuju.fh;sj[a].gzhgc = sj[i].pjgc + sj[i].gzs;}}shuju.zjl += sj[a].jl;//計算總距離}//計算高差閉合差shuju.fh = shuju.sumh + Convert.ToDouble(shuju.qd) - Convert.ToDouble(shuju.zd);if (Math.Abs(shuju.fh) > 20 * Math.Pow(shuju.zjl / 1000, 0.5)){MessageBox.Show("高差閉合差超限");}//計算高差改正數//計算改正后高差for (int i = 0; i < shuju.czs.Length; i++){sj[i].gzs = -(sj[i].jl / shuju.zjl) * shuju.fh;sj[i].gzhgc = sj[i].pjgc + sj[i].gzs;}//高程for (int i = 0; i < sj.Count; i++){if (i == 0){sj[i].dhgc = Convert.ToDouble(shuju.qd) + sj[i].gzhgc;}else{sj[i].dhgc = sj[i - 1].dhgc + sj[i].gzhgc;}}}}public void GridBuild2(){for (int i = 0; i < sj.Count; i++){dataGridView2.Rows.Add();dataGridView2.Rows[i].Cells[0].Value = sj[i].czbh;dataGridView2.Rows[i].Cells[1].Value = Math.Round(sj[i].hj, 4);dataGridView2.Rows[i].Cells[2].Value = Math.Round(sj[i].qj, 4);dataGridView2.Rows[i].Cells[3].Value = Math.Round(sj[i].sjc, 4);dataGridView2.Rows[i].Cells[4].Value = Math.Round(sj[i].sjch, 4);dataGridView2.Rows[i].Cells[5].Value = Math.Round(sj[i].gczs, 4);dataGridView2.Rows[i].Cells[6].Value = Math.Round(sj[i].gc, 4);}}private void chart1_Click(object sender, EventArgs e){}private void 生成外業觀測手簿ToolStripMenuItem_Click(object sender, EventArgs e){}private void 生成平差高程誤差配賦表ToolStripMenuItem_Click(object sender, EventArgs e) {}private void 導出外業觀測手簿ToolStripMenuItem_Click(object sender, EventArgs e){int i ;SaveFileDialog dlg = new SaveFileDialog();dlg.Filter = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*";if (dlg.ShowDialog() == DialogResult.OK){string path = dlg.FileName;StreamWriter sw = new StreamWriter(path);sw.WriteLine(" 四等水準測量觀測手簿");sw.WriteLine("測站 后下絲 前下絲 方 向 標 尺 讀 數 K + 黑");sw.WriteLine("編號 尺上絲 尺上絲 及 減 高差");sw.WriteLine(" 后距 前距 尺 號 黑 紅 紅 中數");sw.WriteLine(" 視距差d Σd 面 面");sw.WriteLine("");for (i = 0; i < sj.Count; i++){sw.WriteLine( sj[i].czbh + " " + sj[i].hcs + " " + sj[i].qcs + " 后 " + sj[i].hchmzs1 + " " + sj[i].hchmzs2 + " " + sj[i].kjhjh1);sw.WriteLine(" " + sj[i].hcx + " " + sj[i].qcx + " 前 " + sj[i].qchmzs1 + " " + sj[i].qchmzs2 + " " + sj[i].kjhjh2 + " " + sj[i].gczs);sw.WriteLine(" " + sj[i].qj + " " + sj[i].hj + " 后-前 " + sj[i].hjq11 + " " + sj[i].hjq12 + " " + sj[i].kjhjh3);sw.WriteLine(" " + Math.Round(sj[i].sjc, 4) + " " + Math.Round(sj[i].sjch, 4));}MessageBox.Show("保存路徑:" + dlg.FileName);sw.Close();}else{MessageBox.Show("保存失敗!");}} private void 導出ToolStripMenuItem_Click_1(object sender, EventArgs e){int i ;SaveFileDialog dlg = new SaveFileDialog();dlg.Filter = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*";if (dlg.ShowDialog() == DialogResult.OK){string path = dlg.FileName;StreamWriter sw = new StreamWriter(path);sw.WriteLine( " 高程誤差配賦表\r\n"); sw.WriteLine( "點號 距離(m) 平均高差(m) 改正數(m) 改正后高差(m) 點之高程(m) 備注" + "\r\n");for (i = 0; i < shuju.dh.Length; i++){if (i == 0){sw.WriteLine(shuju.dh[i] + " " + shuju.qd + "\r\n");sw.WriteLine(" " + Math.Round(sj[i].jl, 1) + " " + Math.Round(sj[i].pjgc,3) + " " +Math.Round(sj[i].gzs, 4) + " " + Math.Round(sj[i].gzhgc, 3) + " " + "\r\n");}else if (i == shuju.dh.Length-1){sw.WriteLine(shuju.dh[i] + " " + Math.Round(sj[i - 1].dhgc, 3) + "\r\n");}else{sw.WriteLine(shuju.dh[i] + " " + Math.Round(sj[i - 1].dhgc, 3) + "\r\n");sw.WriteLine(" " + Math.Round(sj[i].jl, 1) + " " + Math.Round(sj[i].pjgc, 3) + " " +Math.Round(sj[i].gzs, 4) + " " + Math.Round(sj[i].gzhgc, 3) + " " + "\r\n");}}sw.WriteLine("總距離(m): " + shuju.zjl + "\r\n");sw.WriteLine("閉合差(mm): " + Math.Round(shuju.fh, 3) * 1000 + "\r\n");sw.WriteLine("每公里改正數(mm): " + Math.Round(Math.Round(shuju.fh, 3) * 1000 / shuju.zjl * 1000, 0) + "\r\n");sw.WriteLine("路線閉合差(mm): " + Math.Round(20 * Math.Pow(shuju.zjl / 1000, 0.5), 0));MessageBox.Show("保存路徑:" + dlg.FileName);sw.Close();}else{MessageBox.Show("保存失敗!");}}private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e){}private void richTextBox1_TextChanged(object sender, EventArgs e){}private void richTextBox2_TextChanged(object sender, EventArgs e){}private void dataGridView2_CellContentClick(object sender, DataGridViewCellEventArgs e){}private void 重置ToolStripMenuItem_Click(object sender, EventArgs e){dataGridView1.Rows.Clear();dataGridView2.Rows.Clear();richTextBox2.Text = "";richTextBox1.Text = "";shuju.fh = 0;shuju.sumh = 0;shuju.zjl = 0;sj.Clear();}private void 保存數據ToolStripMenuItem_Click(object sender, EventArgs e){}private void 外業觀測手簿ToolStripMenuItem_Click(object sender, EventArgs e){int i;richTextBox1.AppendText(Environment.NewLine);richTextBox1.Text = " 四等水準測量觀測手簿\n";richTextBox1.Text += "測站 后上絲 前上絲 方 向 標 尺 讀 數 K + 黑\n";richTextBox1.Text += "編號 尺下絲 尺下絲 及 減 高差\n";richTextBox1.Text += " 后距 前距 尺 號 黑 紅 紅 中數\n";richTextBox1.Text += " 視距差d Σd 面 面\n";richTextBox1.Text += "";for (i = 0; i < sj.Count; i++){richTextBox1.Text += " " + sj[i].czbh + " " + sj[i].hcs + " " + sj[i].qcs + " 后 " + sj[i].hchmzs1 + " " + sj[i].hchmzs2 + " " + sj[i].kjhjh1 + "\r\n";richTextBox1.Text += " " + sj[i].hcx + " " + sj[i].qcx + " 前 " + sj[i].qchmzs1 + " " + sj[i].qchmzs2 + " " + sj[i].kjhjh2 + " " + sj[i].gczs + "\r\n";richTextBox1.Text += " " + sj[i].hj + " " + sj[i].qj + " 后-前 " + sj[i].hjq11 + " " + sj[i].hjq12 + " " + sj[i].kjhjh3 + "\r\n";richTextBox1.Text += " " + Math.Round(sj[i].sjc, 4) + " " + Math.Round(sj[i].sjch, 4) + " " + "\r\n";}}private void 高程誤差配賦表ToolStripMenuItem_Click(object sender, EventArgs e){richTextBox2.AppendText(Environment.NewLine);richTextBox2.Text += " 高程誤差配賦表\r\n";richTextBox2.Text += "點號 距離(m) 平均高差(m) 改正數(m) 改正后高差(m) 點之高程(m) 備注" + "\r\n";for (int i = 0; i < shuju.dh.Length; i++){if (i == 0){richTextBox2.Text += shuju.dh[i] + " " + shuju.qd + "\r\n";richTextBox2.Text += " " + Math.Round(sj[i].jl, 1) + " " + Math.Round(sj[i].pjgc, 3) + " " +Math.Round(sj[i].gzs, 4) + " " + Math.Round(sj[i].gzhgc, 3) + " " + "\r\n";}else if (i == shuju.dh.Length - 1){richTextBox2.Text += shuju.dh[i] + " " + Math.Round(sj[i - 1].dhgc, 3) + "\r\n";}else{richTextBox2.Text += shuju.dh[i] + " " + Math.Round(sj[i - 1].dhgc, 3) + "\r\n";richTextBox2.Text += " " + Math.Round(sj[i].jl, 1) + " " + Math.Round(sj[i].pjgc, 3) + " " +Math.Round(sj[i].gzs, 4) + " " + Math.Round(sj[i].gzhgc, 3) + " " + "\r\n";}}richTextBox2.Text += "總距離(m): " + shuju.zjl + "\r\n";richTextBox2.Text += "閉合差(mm): " + Math.Round(shuju.fh, 3) * 1000 + "\r\n";richTextBox2.Text += "每公里改正數(mm): " + Math.Round(Math.Round(shuju.fh, 3) * 1000 / shuju.zjl * 1000, 0) + "\r\n";richTextBox2.Text += "路線閉合差(mm): " + Math.Round(20 * Math.Pow(shuju.zjl / 1000, 0.5), 0);}private void dataGridView1_CellContentClick_1(object sender, DataGridViewCellEventArgs e){}} }Form2就是參數設置的窗體,其實沒什么東西,就是預置我實習時候的設置,方便計算的。
namespace work {public partial class Form2 : Form{List<Shuju> sj = new List<Shuju>();Shuju shuju = new Shuju();public Form2(){InitializeComponent();}private void label1_Click(object sender, EventArgs e){}private void label2_Click(object sender, EventArgs e){}public void button1_Click(object sender, EventArgs e){if (textBox1.Text ==""||textBox2.Text == ""||textBox3.Text == "" || textBox4.Text == ""||textBox6.Text == ""||textBox7.Text == "" ||textBox8.Text == "" || textBox9.Text == ""){MessageBox.Show("未完整輸入數據");}else{Close();}}private void label5_Click(object sender, EventArgs e){}private void textBox2_TextChanged_1(object sender, EventArgs e){}private void label6_Click(object sender, EventArgs e){}private void label8_Click(object sender, EventArgs e){}private void TextBox8_TextChanged(object sender, EventArgs e){}private void label11_Click(object sender, EventArgs e){}private void comboBox1_SelectedIndexChanged(object sender, EventArgs e){if (comboBox1.Text == "四等"){ textBox6.Text = "3";textBox7.Text = "10";textBox8.Text = "3";textBox9.Text = "5";}else{textBox6.Text = "";textBox7.Text = "";textBox8.Text = "";textBox9.Text = "";MessageBox.Show("請手動輸入");}}private void textBox7_TextChanged(object sender, EventArgs e){}private void textBox1_TextChanged(object sender, EventArgs e){}private void textBox3_TextChanged(object sender, EventArgs e){}private void Form2_Load(object sender, EventArgs e){}private void label12_Click(object sender, EventArgs e){}private void textBox5_TextChanged(object sender, EventArgs e){}private void comboBox2_SelectedIndexChanged(object sender, EventArgs e){if (comboBox2.Text == "第一圈"){textBox1.Text = "a,b,c,d,e,f,g,a";textBox2.Text = "81";textBox3.Text = "10,8,13,13,13,10,14";textBox4.Text = "0";textBox5.Text = "0";comboBox1.Text = "四等";}else if (comboBox2.Text == "第二圈"){textBox1.Text = "a,g,f,e,d,c,b,a";textBox2.Text = "84";textBox3.Text = "12,10,14,12,14,10,12";textBox4.Text = "0";textBox5.Text = "0";comboBox1.Text = "四等";}else if (comboBox2.Text == "第三圈"){textBox1.Text = "a,b,c,d,e,f,g,a";textBox2.Text = "84";textBox3.Text = "12,10,14,12,14,10,12";textBox4.Text = "0";textBox5.Text = "0";comboBox1.Text = "四等";}}} }四、結語
這個程序是我第一次實習的時候編寫的,有助于你用C#寫測繪工程實習程序,特別的需要批量處理的。謝謝您的閱讀。
如果你有基礎,看源碼就可以了。如果你才學C#窗體,我覺得你下載這一個程序或者閉合導線那個基本上可以滿足測繪程序編寫的要求了,不用每個問題都去搜索,這兩個程序基本都包括了。
我的其他文章:
相關下載鏈接:
需要的可以支持一下。如果有什么不懂的,可以私信,我看到了會回答的。
、
總結
以上是生活随笔為你收集整理的利用C#编写一个水准测量近似平差程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mongodb启动显示Unclean s
- 下一篇: css 下划线