一、说明:
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();
}
本次内容就分享到这里,大家有什么问题可以评论区留言,以后也会陆续给大家分享测绘相关的程序设计内容,希望大家点点关注,多多支持。