武汉大学测绘学院-数字地形测量-附和三角高程程序设计

一、说明:

1.采用C++语言,编程实现《附合三角高程导线平差计算》。

2.文章给出了计算流程和源代码。

二、算法实现:

三角高程测量是根据两点间的距离和垂直角,计算两点间的高差。适用于在地形起伏大的地区进行高程控制。如图1所示,在地面上A、B两点间测定高差,A点设置仪器,在B点竖立标尺。量取望远镜旋转轴中心到地面点上A点的仪器高,用望远镜中的十字丝的横丝照准B点标尺上的一点M,它距B点的高度称为目标高,测出倾斜视线IM与水平视线IN间所夹的竖角(垂直),若A、B两点间的斜距离已知为S,则由可得A、B两点间的高差。

三、计算流程及源代码

1.数据文件读取:

222

void readfile(string filename)
{
	ifstream infile(filename);
	vector <string> lines;
	string line;
	while (getline(infile, line))
	{
		lines.push_back(line);
	}
	int i = 0;
	for (int j = 1; j <= size(lines); j++)
	{
		if (j<=2)
		{
			vector <string> parts1;
			parts1 = split(lines[j-1], ',');
			P[j-1].name = parts1[0];
			P[j-1].H=stod(parts1[1]);//读取控制点数据
		}
		else if (j == 5 || j == 6 || j == 8 || j == 9 || j == 11 || j == 12 || j == 14 || j == 15 || j == 17 || j == 18||j==20||j==21||j==23||j==24)
		{
			vector<string> parts2;
			parts2 = split(lines[j-1], ',');
			D[i].name1 = parts2[0];
			D[i].name2=parts2[1];
			D[i].d = stod(parts2[2]);
			D[i].angle = stod(parts2[3]);
			D[i].h0 = stod(parts2[4]);
			D[i].h=stod(parts2[5]);//赋值给变量
			int du = int(D[i].angle);
			int fen = int((D[i].angle - du) * 100);
			int miao = D[i].angle * 10000 - du * 10000 - fen * 100;
			D[i].angle = (du + fen / 60.0 + miao / 3600.0)*PI / 180.0;//度分秒转换为弧度
			i = i + 1;//读取各测段数据
		}
		else if (j == 4 || j == 7 || j == 10 || j == 13 || j == 16 || j == 19 || j == 22)
		{
			Name_C.push_back(lines[j - 1]);
		}
	}
	infile.close();
}

2. 数据预处理

3.高程计算

4.近似平差计算

5.观测点高程计算

 6.计算部分代码如下

void cal_h(Data D[],point P[])
{
	vector<double> h;//高差
	vector<double> h_v;//改正后高差
	vector<int> k;//是否超限
	vector<double> h_av;//高差平均值
	double h_sum = 0;//高差平均值的和
	double fh = 0;//高差闭合差限差
	vector<double> H;//高程
	vector<double> H_v;//改正后高程
	vector<double> v;//高差改正数
	double sum_D = 0;//斜距的和
	for (int i = 0; i <= 13; i++)
	{
		double hk = D[i].d*tan(D[i].angle) + D[i].h0 - D[i].h;//计算限差
		h.push_back(hk);
	}
	for (int i = 0; i <= 12; i = i + 2)
	{
		double deta = 40 * sqrt(D[i].d);
		deta = deta / 1000.0;//mm转换成m
		if (abs(h[i] + h[i + 1]) <= deta)
		{
			double k0 = 1;
			k.push_back(k0);//闭合差不超限赋值为1
		}
		else
		{
			double k1 = 0;
			k.push_back(k1);//闭合差不超限赋值为0
		}
		double hk1 = (h[i] - h[i + 1]) / 2;
		h_av.push_back(hk1);
		sum_D = sum_D + D[i].d;
	}
	H.push_back(P[0].H);//第一个已知点的高程
	for (int i = 0; i <= size(h_av)-1; i++)
	{
		double H1 = H[i] + h_av[i];//计算高程
		H.push_back(H1);
		h_sum = h_sum + h_av[i];
	}
	fh = h_sum - (P[1].H - P[0].H);//计算闭合差限差
	for (int i = 0; i <= 12; i = i + 2)
	{
		double v1 = -fh * ((D[i].d+D[i+1].d) / (2*sum_D));//计算高差改正数
		v.push_back(v1);
	}
	H_v.push_back(P[0].H);
	for (int i = 0; i <= size(v) - 1; i++)
	{
		double h1 = h_av[i] + v[i];//计算改正后的高差
		h_v.push_back(h1);
		double Hv = H_v[i] + h_v[i];
		H_v.push_back(Hv);//计算观测点高程
	}
	for (int i = 0; i <= 12; i=i+2)
	{
		Name_point.push_back (D[i].name1);
	}
	Name_point.push_back ("A44");
//-----------------———计算完毕,现在开始输出文件------------------
	ofstream outfile("result.txt");
	outfile << "---------------------往返高差--------------------" << endl;
	outfile << fixed << setprecision(3);//保留三位小数
	for (int i = 0; i <= size(h) - 1; i=i+2)
	{
		outfile << Name_C[i/2]<<"  "<< h[i] <<"  "<<h[i+1]<< endl;
	}
	outfile << "---------------------超限检查--------------------" << endl;
	for (int i = 0; i <= size(Name_C) - 1; i++)
	{
		if (k[i] == 1)
		{
			outfile << Name_C[i] << "  " << "未超限" << endl;
		}
		else
		{
			outfile << Name_C[i] << "  " << "超限" << endl;
		}
	}
	outfile << "---------------------高程计算--------------------" << endl;
	for (int i = 0; i <= size(H) - 1; i++)
	{
		outfile <<Name_point[i]<< "  " << H[i] << endl;
	}
	outfile<< "---------------------高差闭合差--------------------" << endl;
	if (fh >= 20 * sqrt(sum_D) / 1000.0)
	{
		outfile << fh << "  " << "超限" << endl;
	}
	else
	{
		outfile << fh << "  " << "未超限" << endl;
	}
	outfile << " --------------------高差改正数--------------------" << endl;
	for (int i = 0; i <= size(v) - 1; i++)
	{
		outfile << Name_C[i] << "  " << v[i] << endl;
	}
	outfile << " --------------------改正后高差--------------------" << endl;
	for (int i = 0; i <= size(v) - 1; i++)
	{
		outfile << Name_C[i] << "  " <<h_v[i] << endl;
	}
	outfile << " --------------------改正后高程--------------------" << endl;
	for (int i = 0; i <= size(H_v) - 1; i++)
	{
		outfile << Name_point[i] << "  " << H_v[i] << endl;
	}
	outfile.close();
}

    本次内容就分享到这里,大家有什么问题可以评论区留言,以后也会陆续给大家分享测绘相关的程序设计内容,希望大家点点关注,多多支持。

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值