測量水準程序

在測量學中,水準測量是一種常用的高程測量方法,重複性的計算工作需要通過編程來方便計算。

1.算法原理

在本文合水準路線爲例,其中算法原理如下:

H理=H終點 – H起點

Fh= H理  – H測

Fh允=±20√L

Vkm=-Fh/L

按比例分配

2.實現代碼


        /// <summary>
        /// 
        /// 進行平差計算
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button4_Click(object sender, EventArgs e)
        {
            //把距離存進來
            try
            {
                double[] ll = new double[d + 1];
                int a = 1;
                double Lz = 0;

                for (int ii = 0; ii < d + 1; ii++)
                {
                    ll[ii] = Convert.ToDouble(dataGridView1.Rows[a].Cells[2].Value);
                    Lz += ll[ii];
                    a++;
                }
                Lz = Math.Round(Lz, 5);
                dataGridView1.Rows[d + 3].Cells[2].Value = Lz;
                //把高差存進來
                double[] hh = new double[d + 1];
                double Hc = 0;

                int b = 1;
                for (int jj = 0; jj < d + 1; jj++)
                {
                    hh[jj] = Convert.ToDouble(dataGridView1.Rows[b].Cells[3].Value);
                    Hc += hh[jj];//所測得的高差之和,就是實際高差
                    b++;
                }
                dataGridView1.Rows[d + 3].Cells[3].Value = Hc;
                //求出高差改正數
                double Hl = Convert.ToDouble(dataGridView1.Rows[d + 2].Cells[6].Value) - Convert.ToDouble(dataGridView1.Rows[0].Cells[6].Value);//理論高差
                double Fh = Hc - Hl;
                double Fy = Math.Round(20 * Math.Sqrt(Lz), 0);
                if (1000*Math.Abs(Fh) > Math.Abs(Fy))
                {
                    MessageBox.Show("閉合差的允許值爲:+-" + Math.Abs(Fy).ToString());
                    return;
                }
                double[] Hi = new double[d + 1];
                double[] Vi = new double[d + 1];
                double x_temp = Math.Round(Fh / Lz * 1000, 0);//mm的等級
                double h_temp = 0;
                double v_temp = 0;
                int cc = 1;
                for (int dd = 0; dd < d + 1; dd++)
                {
                    Vi[dd] = ll[dd] * x_temp;
                    Vi[dd] = -Vi[dd];
                    v_temp += Vi[dd];
                    Hi[dd] = hh[dd] + Vi[dd] / 1000;
                    Hi[dd] = Math.Round(Hi[dd], 5);
                    h_temp += Hi[dd];
                    h1 += Hi[dd];
                    h1 = Math.Round(h1, 5);
                    dataGridView1.Rows[cc].Cells[4].Value = Vi[dd];//把高差改正數寫到表上
                    dataGridView1.Rows[cc].Cells[5].Value = Hi[dd];//把改正後的高差寫到表上
                    dataGridView1.Rows[cc].Cells[6].Value = h1;//把計算後的高程寫到表上
                    cc++;
                }
                dataGridView1.Rows[d + 3].Cells[4].Value = v_temp;
                dataGridView1.Rows[d + 3].Cells[5].Value = h_temp;
                richTextBox1.Visible = true;
                richTextBox1.Text = "歡迎使用平差小程序!\n";
                richTextBox1.Text += "理論高差=";
                richTextBox1.Text += h_temp + "\n";
                richTextBox1.Text += "實際高差=";
                richTextBox1.Text +=  Hc+ "\n";
                richTextBox1.Text += "閉合差=";
                richTextBox1.Text += v_temp + "\n";
                richTextBox1.Text += "理論閉合差=";
                richTextBox1.Text += Fy + "\n";

            }
            catch(Exception ex)
            {
                MessageBox.Show("出錯:"+ex.Message);
            }
        }

3.實現效果

4.源代碼地址

Github: https://github.com/Ahmiao/MeasurementLevel.git


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章