附合导线平差程序设计报告 本文关键词:导线,程序设计,报告,附合
附合导线平差程序设计报告 本文简介:地图学课程设计报告《测量平差程序》课程设计(报告)学生姓名:罗正材学号:1108030128专业:2011级测绘工程指导教师:肖东升目录一、前言…………………………………………………………3二、平差程序的基本要求………………………………………3三、平差程序模块化……………………………………………3四
附合导线平差程序设计报告 本文内容:
地图学课程设计报告
《测量平差程序》课程设计
(报告)
学生姓名:罗正材
学
号:1108030128
专
业:2011级测绘工程
指导教师:肖
东
升
目录
一、前言…………………………………………………………3
二、平差程序的基本要求………………………………………3
三、平差程序模块化……………………………………………3
四、平差中的重要函数…………………………………………4
五、结论…………………………………………………………7
六、部分源代码…………………………………………………7
一、前言
随着测绘科学技术的不断发展,在测量数据的处理中产生很多种平差的方法。在本文中,附合导线近似平差程序是利用C++编程实现的,我们需要将导线网的已知数据信息按照特定的规则输入到.txt文本中,利用C++程序读取文本数据信息后,对其进行一系列的平差计算,最终获得平差后的结果,并以.txt文本的形式输出且保存,这样就可为测量工作提供一定的参考,还能为测绘数据的管理带来帮助。
二、平差程序的基本要求
平差程序设计与其它程序设计相同,应当满足一定的要求。
(1)程序逻辑结构简单,清晰易读,符合结构化程序设计要求,便于扩展;
(2)运算速度快,占用内存小,内外存之间的交换不宜过于频繁;
(3)数学模型及计算方法正确、先进,计算结果精度高;
(4)适应性强,便于移植,充分考虑各种可能形式,尽量满足不同要求与需要;
(5)方便用户,操作简便。数据输入与用户作业方式与习惯相统一,输出明了、齐全;尽量减少手工处理工作量,操作简便;人机交互性要强。
上述要求,既体现在平差程序的总体设计中,也贯穿于平差程序设计的各个环节中。
三、平差程序模块化
图1
四、平差中的重要函数
(一)、角度制与弧度制的相互转化
C/C++程序设计中,关于角度的计算以弧度制为单位,而在测量以及具体工作中我们通常习惯以角度制为单位。这样,在数据处理中,经常需要在角度制与弧度制之间进行相互转化。这里,我们利用C/C++数学函数库math.h中的相关函数完成这两种功能。
这里,我们使用double类型数据表示角度制数和弧度制数。例如:123度44分58.445秒,用double类型表示为123.4458445,其中分、秒根据小数位确定。
在角度制与弧度制的转化中,涉及如下图2所示的两个环节。
度.分秒
度
弧度
图2
1.角度化弧度函数
double
d_h(double
angle)
//角度化弧度
{
double
a,b;
angle=modf(angle,//a
为提取的度值(int类型),angle为分秒值(小数)
angle=modf(angle*100.0,//
b为提取的分值(int类型),angle为秒值(小数)
return
(a+b/60.0+angle/36.0)*(PI+3.0E-16)/180.0;
}
2.弧度化角度函数
double
h_d(double
angle)
//弧度化角度
{
double
a,b,c;
angle=modf(angle*180.0/(PI-3.0E-16),angle=modf(angle*60.0,angle=modf(angle*60.0,return
a+b*0.01+c*0.0001+angle*0.0001;
}
其中,函数modf(angle,double
s;
f
=
dms>=0
?
1
:
-1;
//0.001秒
=
4.8481368110953599358991410235795e-9弧度
dms
+=
f
0.0000001;
d
=
(int)dms;
dms
=
(dms
-
d)
100.0;
m
=
(int)dms;
s
=
(dms
-
m)
100.0;
return
(d
+
m
/
60.0
+
s
/
3600.0)
_TORAD
-
f
4.8481368110953599358991410235795e-9;
}
//弧度转“度分秒”
double
RADtoDMS(double
rad)
{
int
f
=
rad
>=
0
?
1
:
-1;
//
符号
+
-
//加0.001秒(用弧度表示),化为度
rad
=
(rad
+
f
4.8481368110953599358991410235795e-9)
_TODEG;
int
d
=
(int)rad;
rad
=
(rad
-
d)
60.0;
int
m
=
(int)rad;
double
s
=
(rad
-
m)
60.0;
return
d
+
m
/
100.0
+
s
/
10000.0
-
f
0.0000001;
}
//读入已知点的坐标
void
ReadKnwData(FILE
in,DyArray
array)
{
char
buffer[256];
double
dx,dy;
SurPnt
pnt;
while
(
!feof(in)
)
{
fgets(buffer,sizeof(buffer),in);
if
(
sscanf(buffer,“%s
%lf
%lf“,pnt.name,}
else
break;
}
dx
=
array->elem[1].x
-
array->elem[0].x;
dy
=
array->elem[1].y
-
array->elem[0].y;
adj.azi0=atan2(dy,dx)
+
(dy
elem[3].x
-
array->elem[2].x;
dy
=
array->elem[3].y
-
array->elem[2].y;
adj.azin=atan2(dy,dx)
+
(dy
elem[1].x;
adj.y1=array->elem[1].y;
adj.xn=array->elem[2].x;
adj.yn=array->elem[2].y;
Destroy(array);//
}
//观测值信息写到动态数组
void
ReadObsValue(FILE
in,DyArray
array)
{
char
buffer[256];
double
dir0,dir1,dist0,dist1;
SurPnt
pnt;//用于临时保存点的坐标
while
(
!feof(in)
)
{
fgets(buffer,sizeof(buffer),in);
if(
feof(in)
)
return;
if(sscanf(buffer,“%s
%s
%lf
%lf
%s
%lf
%lf“,pnt.name,pnt.dir0.name,pnt.dir0.dist=dist0;
pnt.dir1.dv=DMStoRAD(dir1);
pnt.dir1.dist=dist1;
pnt.b=pnt.dir1.dv-pnt.dir0.dv+(pnt.dir1.dv-pnt.dir0.dvlength;
i++)
{
sumb+=array->elem[i].b;
}
adj.fb=adj.azi0+sumb-_PI*array->length-adj.azin;
adj.v=-adj.fb/array->length;
adj.fb=adj.fb/_PI*180*3600;
adj.fr=2*8*sqrt(array->length);
if
(abs(adj.fb)
>=
adj.fr)
strcpy(adj.judge,“方位角闭合差超限了!“);
else
strcpy(adj.judge,“方位角闭合差没超限“);
}
//角度改正
void
CorrectAngle(DyArray
array)
{
for
(int
i=0;
ilength;
i++)
{
array->elem[i].b+=adj.v;
}
adj.v=adj.v/_PI*180*3600;
}
//推算方位角
void
Direct(DyArray
array)
{
SurPnt
pnt;
//第一个未知边
pnt.dir1.alfa=adj.azi0+array->elem[0].b-_PI;
pnt.dir1.dist=(array->elem[0].dir1.dist+array->elem[1].dir0.dist)/2;
pnt.dir1.dx=pnt.dir1.dist*cos(pnt.dir1.alfa);
pnt.dir1.dy=pnt.dir1.dist*sin(pnt.dir1.alfa);
AddDir(array,pnt,0);
for(int
i=1;ilength-1;i++)
{
pnt.dir1.alfa=array->elem[i-1].dir1.alfa+array->elem[i].b-_PI;
pnt.dir1.dist=(array->elem[i].dir1.dist+array->elem[i+1].dir0.dist)/2;
pnt.dir1.dx=pnt.dir1.dist*cos(pnt.dir1.alfa);
pnt.dir1.dy=pnt.dir1.dist*sin(pnt.dir1.alfa);
AddDir(array,pnt,i);
}
for(i=0;ilength-1;i++)
{
array->elem[i].dir1.alfa=RADtoDMS(array->elem[i].dir1.alfa);//alfa转为角度
}
}
//坐标增量改正
void
CorrectDirect(DyArray
array)
{
double
sumx=0.0;
double
sumy=0.0;
double
sums=0.0;
for(int
i=0;ilength-1;i++)
{
sumx+=array->elem[i].dir1.dx;
sumy+=array->elem[i].dir1.dy;
sums+=array->elem[i].dir1.dist;
}
adj.fx=adj.x1+sumx-adj.xn;
adj.fy=adj.y1+sumy-adj.yn;
adj.fs=sqrt(adj.fx*adj.fx+adj.fy*adj.fy);
adj.f=int(sums/adj.fs);//导线全长相对闭合差分母
for(
i=0;ilength-1;i++)
{
array->elem[i].dir1.dx-=adj.fx*array->elem[i].dir1.dist/sums;//坐标增量改正
array->elem[i].dir1.dy-=adj.fy*array->elem[i].dir1.dist/sums;
}
}
//解算近似平差坐标
void
Coordinate(DyArray
array)
{
SurPnt
pnt;
array->elem[0].x=adj.x1;
array->elem[0].y=adj.y1;
for(int
i=0;ilength-2;i++)
{
//strcpy(pnt.name,array->elem[i+1].name);
pnt.x=array->elem[i].x+array->elem[i].dir1.dx;//
pnt.y=array->elem[i].y+array->elem[i].dir1.dy;
AddCor(array,pnt,i+1);
}
}
//输出
void
Print(DyArray
array,FILE
out)
{
double
d,m,s;
fprintf(out,“方位角闭合差fb=%.0lf秒
%s
角度改正v=%.0lf秒/n“,adj.fb,adj.judge,adj.v);
fprintf(out,“坐标增量闭合差
fx=%.0lfmm
fy=%.0lfmm
fs=%.0lfmm/n“,adj.fx*1000,adj.fy*1000,adj.fs*1000);
fprintf(out,“导线全长相对闭合差
fs/∑S=1/%d/n/n“,adj.f);
fprintf(out,“坐标方位角/n“);
for
(int
i=0;
ilength-1;
i++)
{
d=array->elem[i].dir1.alfa;
m=(d-(int)d)*100;
s=(m-(int)m)*100;
fprintf(out,“α%s-%s=%.0lf°%.0lf′%.0lf″/n“,array->elem[i].name,array->elem[i+1].name,d,m,s);
}
fprintf(out,“/n近似平差坐标/n“);
for
(i=1;
ilength-1;
i++)
{
fprintf(out,“%s
x=%.3lfm
y=%.3lfm/n“,array->elem[i].name,array->elem[i].x,array->elem[i].y);
}
}
int
main(int
argc,char*
argv[])
{
DyArray
pnts;
Init(
char
infile[255],outfile[255];
if
(argc
<
2)
{
printf(“Enter
infile
name:/n“);
scanf(“%s“,infile);
}
else
strcpy(infile,argv[1]);
FILE
in
=
fopen(infile,“r“);
if(in
==
NULL)
{
printf(“File
%s
cann
t
open!“,infile);
return
-1;
}
if
(argc
<
3)
{
printf(“Enter
outfile
name:/n“);
scanf(“%s“,outfile);
}
else
strcpy(outfile,argv[2]);
FILE
out
=
fopen(outfile,“w“);
if(out
==
NULL)
{
printf(“File
%s
cann
t
open!“,outfile);
return
-1;
}
//读入已知点的坐标
ReadKnwData(in,Init(
//观测值信息写到动态数组
ReadObsValue(in,//求角度闭合差fb
Fb(
//角度改正
CorrectAngle(
//推算方位角
Direct(
//坐标增量改正
CorrectDirect(
//解算近似平差坐标
Coordinate(
fclose(in);
//输出
Print(
fclose(out);
Destroy(
return
0;
}
14
篇2:《测量平差报告》
《测量平差报告》word版 本文关键词:测量,报告,word
《测量平差报告》word版 本文简介:测量平差程序设计实习报告书学院:某院班级:某班学号:XXXXxXx姓名:某某指导老师:某某程序实验实验目的:通过C#程序设计,对数据进行平差计算,并进行精度平差,消除数据中的矛盾。实验内容及步骤1.水准网平差理论由于存在观测误差,当水准网中有多余观测值时,观测值之间就会存在矛盾,水准网平差的目的是消
《测量平差报告》word版 本文内容:
测量平差程序设计
实
习
报
告
书
学院:某院
班级:某班
学号:XXXXxXx
姓名:某某
指导老师:某某
程序实验
实验目的:通过C#程序设计,对数据进行平差计算,并进行精度平差,消除数据中的矛盾。
实验内容及步骤
1.水准网平差理论
由于存在观测误差,当水准网中有多余观测值时,观测值之间就会存在矛盾,水准网平差的目的是消除矛盾,求得各高程点高程的最可靠值(也叫平差值),并对观测值和平差值进行精度评定。
在参数平差原理的基础上,本实验就选用间接平差结合最小二乘法来进行程序设计。
选用的算例如下
如图所示水准网,A、B
、C三点为已知高程点,
D、E为未知点,各观测高差及路线长度如下表所列。(20分)
用间接平差法计算未知点D、E的高程平差值及其中误差;
高差观测值/m
对应线路长度/km
已知点高程/m
h1=
-1.348
h2=
0.691
h3=
1.265
h4=
-0.662
h5=
-0.088
h5=
0.763
1
1
1
1
1
1
HA=23.000
HB=23.564
CB=23.663
得
,,
2.程序设计思路
(1)定义所需的成员变量。(2)设计数据信息读取程序。
(3)写入平差计算程序。(4)在平差程序设计过程中添加一个数组运算类,包含平差计算数组相乘、转置、求逆等运算。(5)设计数据存放输出文件所需程序。
3.
原始数据文件读取格式
先在Excel中填写题中相关的各个信息如观测总数、总点数、已知点数、已知点及点名对应的已知点高程值等。
4.
读取数据文件,并将数据存入相应变量。
读取文件:
System.Windows.Forms.OpenFileDialogopenFile=newSystem.Windows.Forms.openFileDialog
{
};
string
output;
openFile
.Filter=“文本文件t(.txt)|.txt“;
逐行读取数据并把它存入相应的变量中。
5.
平差计算程序设计
添加类,调用其中数组运算程序,完成平差计算。
求逆,求和及求积。
6.
结果文件存放并输出
存放:
FileStream
fs;//定义一个文件读写实例
string
filename
=
“定义文件存放路径和文件名”
输出:生成新的对象实例,
StreamWriter
sw
=
new
StreamWriter(fs);
sw.Write(“所要输出的数据“)
7.
输出结果文件
8.
实验总结
这次的C#程序实验,相较之前有更大的难度,综合了之前所学的很多的知识,通过这次的实验,对于自己的C#程序设计思路有了比较系统有条理的整理,相信对自己的程序设计能力会有所提高。