闭合导线平差计算

该程序是用C语言编写的,用于处理地理测量中的坐标增量计算和坐标闭合差问题。它包含了角度转换函数,以及通过用户输入的角测量值和边长来计算方位角、坐标增量和坐标闭合差的功能。用户可以对角度和平差后的坐标增量进行修正以确保坐标闭合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C语言半自动版本

算法

 

 ③坐标增量计算及坐标闭合差计算

 

 

 

 

代码

#include <stdio.h>
#include <stdlib.h>
#include<math.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */


//转换角度 ,单位秒 
double tsa(double a,double b,double c){return a*3600+b*60+c;}
//转换角度,单位度
double tsan(double a,double b,double c){return a+b/60+c/3600;}
//positive number
int *pn(int fw[20][3],int i){
	int a,b,c,sum,y,j;
	for(j=0;j<i;j++){
		sum=fw[j][0]*3600+fw[j][1]*60+fw[j][2];
		if(fw[j][0]<0){
			y=(-sum)/360/3600;
			sum=sum+(y+1)*360*3600;	
		}
		fw[j][0]=sum/3600,sum=sum%3600;
			fw[j][1]=sum/60,sum=sum%60;
			fw[j][2]=sum;
	}

} 

int ji(int jiao[20][3],int i ,double s[20])
{
	double sumjiao=0;
	int j;
	for(j=0;j<i;j++){
		sumjiao+=tsa(jiao[j][0],jiao[j][1],jiao[j][2]);
	}
	int f=sumjiao-(i-2)*3600*180;
	
	printf("f为%d秒,请根据f重新输入平差后角度的 度 分 秒 \n",f);	

	for(j=0;j<i;j++)	scanf("%d %d %d",&jiao[j][0],&jiao[j][1],&jiao[j][2]);
	double a12[3] ;
	printf("-------------------- \n");
	printf("请输入边12的方位角的度分秒: \n");

	scanf("%d %d %d",&a12[0],&a12[1],&a12[2]);
	int fw[20][3];
	fw[0][0]=a12[0]-180+jiao[0][0],fw[0][1]=jiao[0][1]+a12[1],fw[0][2]=jiao[0][2]+a12[2];//初始化边23的方位角 
		for(j=1;j<i;j++) {
		fw[j][0]=fw[j-1][0]-180+jiao[j][0],fw[j][1]=jiao[j][1]+fw[j-1][1],fw[j][2]=jiao[j][2]+fw[j-1][2];}//储存方位角 
		double fx=0,fy=0,sx[20],sy[20];
	//保证角度格式 
	for(j=0;j<i;j++) {
		if(fw[j][2]>=60) fw[j][1]+=fw[j][2]/60,fw[j][2]%=60;
		if(fw[j][1]>=60) fw[j][0]+=fw[j][1]/60,fw[j][1]%=60;
	}
	pn(fw,i);
	
	
	for(j=0;j<i;j++) printf("修正后方位角分别为%d度 %d分 %d秒\n",fw[j][0],fw[j][1],fw[j][2]);
	printf("-------------------- \n");
	double fwj[20];
	for(j=0;j<i;j++) fwj[j]=fw[j][0]+(double)(fw[j][1]*60+fw[j][2])/3600,printf("方位角为%lf\n",fwj[j]);//转换角度,单位度	
	printf("-------------------- \n");	
	for(j=0;j<i;j++) {
	sx[j]=s[j]*cos(fwj[j]/180*acos(-1));
	fx+=sx[j];
	sy[j]=s[j]*sin(fwj[j]/180*acos(-1));
	fy+=sy[j];
	printf("%lf 路段坐标增量为x:%.3lfm,y:%.3lfm \n",s[j],sx[j],sy[j]);
	}
	printf("-------------------- \n");	
	printf("x轴坐标闭合差为:%lfmm  \n y轴坐标闭合差为:%lfmm \n",fx*1000,fy*1000);
	return 0;
}

int main(int argc, char *argv[]) {
int i,j,m,jiao[20][3];//数组存储角度初始测量值
double xy[2][2],k=0,s[20],xzy[10][2];
printf("请依次输入已知点2点的x,y坐标:"); 
for(i=0;i<2;i++){
		scanf("%lf",&xy[0][0],&xy[0][1]);
	
}
 double a12=0; 
printf("-------------------- \n");
printf("请输入闭合圈所测角,最后一个内角后加以-2结束 \n"); 

i=0;
 while(k!=-2){
 	for(m=0;m<3;m++){
 		scanf("%d",&jiao[i][m]);
 		if(jiao[i][m]==-2){
		 printf("请输入闭合圈各路段路程单位m\n"); 
 		for(j=0;j<i;j++){
	scanf("%lf",&s[j]);
}

 		goto tiao;}
	 }
i++;
 }
tiao: ji(jiao,i,s);//函数传址和值

printf("-------------------- \n");
printf("重新输入依比例修正后的坐标增量先x后y单位m\n");
for(j=0;j<i;j++){
	for(m=0;m<2;m++){
		 scanf("%lf",&xzy[j][m]);
	}
}
printf("-------------------- \n");
xy[1][0]=xy[0][0],xy[1][1]=xy[0][1];
for(j=0;j<i;j++){
	xy[1][0]+=xzy[j][0];
	xy[1][1]+=xzy[j][1];
	if(j=i-1){
		printf("第%d点坐标为(%.3lfm,%.3lfm)\n",2,xy[1][0],xy[1][1]);
		if(xy[1][0]==xy[0][0]&&xy[1][1]==xy[0][1]) printf("恭喜坐标闭合");
		else printf("坐标不闭合");
		break;
	}
	printf("第%d点坐标为(%.3lfm,%.3lfm)\n",j+3,xy[1][0],xy[1][1]);
}

return 0;

}

示例运行

 

 1,2为已知点,闭合导线共10个测量内角和10条测量边;(角度上限为20个,可自行修改数组维度)

从2角开始逆时针旋转各角分别为(度 分 秒)

90 37 1
227 25 3
132 17 3
89 22 7
179 27 18
91 3 44
179 43 24
87 31 3
94 13 50
268 19 27

从边2,3开始逆时针各边分别为(m)

258.1179
64.5434
126.383
199.0413
166.7015
278.636
198.1801
110.3129
50.0156
202.9068

运行步骤:

 

 

 此处为了运行方便调整角度闭合差为0,若不为0,自行分配角度闭合差后输入平差后的角度值

 

 

自行计算已知边1,2的方位角

 

 根据坐标闭合差,自行定权分配坐标增量;输入改正后的坐标增量检查是否闭合

仅供学习交流使用

 

 

 

### 单一闭合导线计算程序设计 #### 设计思路 单一闭合导线的主要目的是通过调整观测数据来消除闭合,使最终的坐标值更加精确。通常采用最小二乘法来进行处理。 #### 数据准备 输入的数据主要包括各测站的角度观测值、距离观测值以及起始点和终止点的已知坐标。对于角度和距的观测值,还需要考虑其精度权重。 #### 模型建立 构建基于最小二乘原理的数学模型,求解未知数的最佳估值及其协因数矩阵。具体来说就是设置目标函数并利用拉格朗日乘子法或其他优化算法找到最优解。 #### 计算流程实现 下面是一个简单的Python代码示例用于展示如何编写这样的程序: ```python import numpy as np def adjust_closed_traverse(angles, distances, start_coords): """ 对单一封闭导线进行计算 参数: angles (list): 各测站点之间的水夹角列表(度) distances (list): 相邻两点间的斜距列表(米) start_coords (tuple): 起始点坐标(x,y) 返回: list: 经过后的各点坐标[(x1,y1),(x2,y2),...] """ n = len(distances) # 测站数量减去1等于边数 A = [] # 法方程系数阵初始化为空表 L = [0]*n # 常数项向量L初始化为零向量 V = [0]*(2*n+2) # 改正数值V初始化为长度为2n+2的零向量 # 构造法方程式 for i in range(n): dx = distances[i] * np.cos(np.radians(sum(angles[:i]))) dy = distances[i] * np.sin(np.radians(sum(angles[:i]))) row_A = [-dy,dx]+[0]*(2*i)+[-distances[i],0]+[0]*(2*(n-i-1)) A.append(row_A) L[i]=start_coords[0]-dx if not i else coords[i-1][0]-dx L[n+i]=start_coords[1]-dy if not i else coords[i-1][1]-dy N=np.dot(np.transpose(A),A) # 正规化方程组左端项N=ATA U=np.dot(-np.transpose(A),L) # 右端常数U=-AT*L delta_X=np.linalg.solve(N,U) # 解正规方程得改正数delta_X # 更新坐标序列 coords=[start_coords] sum_angle=sum(angles[:-1])+angles[-1]/2 for j in range(len(delta_X)//2): new_x=coords[j][0]+distances[j]*np.cos(np.radians(sum_angle))+delta_X[2*j] new_y=coords[j][1]+distances[j]*np.sin(np.radians(sum_angle))+delta_X[2*j+1] coords.append((new_x,new_y)) return coords ``` 此段代码展示了基本框架,实际应用中还需加入更多细节如权衡因子设定、异常检测等功能模块[^1]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值