80椭球高斯投影坐标换带计算编程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
辽宁工程技术大学
大地测量基础
综合训练二
教学单位测绘与地理科学学院
专业测绘工程
名称 80椭球高斯投影坐标换带计算编程班级测绘14-1
学号
学生姓名
指导教师王佩贤
目录
一、高斯投影坐标换带的原理 (3)
二、高斯投影坐标换带的目的 (6)
三、坐标换带的意义 (8)
四、程序设计基础 (8)
五、程序界面及源码 (11)
六、程序验证 (15)
七、软件评价 (15)
八、软件使用说明 (16)
一、高斯投影坐标换带的原理
1.1高斯投影基本概念
想象有一个椭圆柱面横套在地球椭球体外面,并与某一条子午线(此子午线称为中央子午线或轴子午线)相切,椭圆柱的中心轴通过椭球体中心,然后用一定投影方法,将中央子午线两侧各一定经差范围内的地区投影到椭圆柱面上,再将此柱面展开即成为投影面。
特点:(1)正形投影(角度不变,a=b:长度比与方向无关);
(2)中央子午线投影为纵坐标轴;
(3)中央子午线投影后长度不变。
1.2高斯投影邻带换算
1.定义:将一个带的高斯平面坐标换算为另一带的高斯平面坐标称为高斯坐标的邻带换算
2.内容: 1 )不同六度带和不同三度带之间的化算
2 )三度带和六度带之间的化算
3.方法: 1 )直接法: 利用相邻两带坐标之间关系式进行坐标互换
2 )间接法:通过大地坐标进行高斯正反算互相换算
目前广泛采用间接换带计算法,因此下面就此方法作介绍。
如将第一带(东带或西带)的平面坐标换算为第二带(西带或东带)的平面坐标,方法是先根据第一带的平面坐标x,y和中央子午线的经度L。
按高斯投影坐标反算公式求得大地坐标B,L然后根据B,L和第二带的中央子午线经度按高斯投影坐标正算公式求得在第二带中的平面坐标。
由于在换带计算中,把椭球面
上的大地坐标作为过渡坐标,因而称为间接换带法。
这种方法理论上是严密的,精度高,而且通用性强,他适用于6°带与6°带,3°带与3°带,6°带与3°带之间的坐标换带。
虽然这种方法计算量较大,但可用电子计算机计算来克服,故已成为坐标换带中最基本的方法。
正算公式:
64256
442234
22)5861(cos sin 720)495(cos 24cos sin 2l t t B B N l t B simB N l B B N X x ''+-''+''++-''+''⋅''+
=ρηηρρ 5222425532233)5814185(cos 120)1(cos 6cos l t t t B N l t B N l B N y ''-++-''+''+-''+''⋅''=
ηηρηρρ
其中:角度都为弧度
B 为点的纬度,0l L L ''=-,L 为点的经度,0L 为中央子午线经度; N 为子午圈曲率半径,
1222
(1sin )N a e B -=-;
tan t B =; 222cos e B η'=
180
3600ρπ''=*
其中X 为子午线弧长:
2402464661616sin cos ()(2)sin sin 33X a B B B a a a a a B a B ⎡⎤=--++-+⎢⎥⎣⎦
02468,,,,a a a a a 为基本常量,按如下公式计算:
2004682426844686868
83535281612815722321637816323216128m a m m m m m m a m m m a m m m m a m a ⎧=++++⎪⎪⎪=+++⎪⎪⎪=++⎨⎪⎪=+⎪⎪⎪=⎪⎩
02468,,,,m m m m m 为基本常量,按如下公式计算:
22222020426486379(1);;5;;268
m a e m e m m e m m e m m e m =-====; 反算公式:
()()()()22222432465
3
2235
242225053922461904572012cos 6cos 5282468120cos f f f f f f f f f f f f
f f f f f f f f f f
f f f f f f f
t t B B y t t y M N M N t y t t y
M N y y l t N B N B y t t t N B L l L ηηηηη=-
+++--++=-+++++++=+
其中:0L 为中央子午线经度。
f B 为底点纬度,也就是当x X =时的子午线弧长所对应的纬度。
二、高斯投影坐标换带的目的
1. 换带目的:为了限制高斯投影长度变形,将椭球面按一定经度的子午线划分成不同的投影带;或者为了抵偿长度变形,选择某一经度的子午线作为测区的中央子午线。
由于中央子午线的经度不同,使得椭球面上统一的大地坐标系,变成了各自独立的平面直角坐标系,就需要将一个投影带的平面直角坐标系,换算成另外一个投影带的平面直角坐标,即为坐标换带。
2. 实际应用:
在生产实践中通常有以下两种情况需要换带计算
⑴ 控制网中的已知点位于相邻的两个投影带中。
图中的附合导线,A,B,C,D为已知高级点。
A,B 两点位于西带内,具有西带的高斯平面直角坐标值;C,D两点位于东带内,具有东带的高斯平面直角坐标值。
在坐标平差计算时,就必须将它们的坐标系统统一起来,或是将A,B 点的西带坐标值换算至东带,或是将C,D点的东带坐标值换算至西带。
(2)⑵国家控制点的坐标通常是6°带的坐标,而在工程测量中往往需要采用3°带或1.5°带,这就产生了6°带与3°带或 1.5°带之间的坐标换算问题。
3°带的中央子午线中,有半数与6°带的中央子午线重合。
所以,由6°带到3°带的换算区分为2种情况:
①3°带与6°带的中央子午线重合如图所示,3°带第41带与6°第21带的中央子午线重合。
既然中央子午线一致,坐标系统也就一致。
所以,图中P1点在6°带第21带的坐标,也就是该点在3°带第41带的坐标。
在这种情况下,6°带与3°带之间,不存在换带计算问题。
②3°带中央子午线与6°带分带子午线不重合如图所示,若已知P2点在6°带第21带的坐标,求它在3°带第42带的坐标。
由于这2个投影带的中央子午线不同,坐标系统不一致,必须进行换带计算。
不过P2点在6°带第21带的坐标与它在3°第41带的坐标相同,所以6°带到3°带坐标换算,也可看作是3°带到3°带的邻带坐标换算。
换带计算目前广泛采用高斯投影坐标正反算方法,他适用于任何情况下的换带计算工作。
这种方法的程序是:首先将某投影带的已知平面坐标(x1,y1 ),按高斯投影坐标反算公式求得其大地坐标(B,L);然后根据纬度B
和对于所选定的中央子午线的经差,按高斯投影坐标正算公式求其在选定的投影带的平面坐标(x2,y2)。
三、坐标换带的意义
在进行工程测量时,我们经常会遇到投影区域长度变形过大或测量的过程中所使用的坐标系不同,导致在内业计算时遇到困难等情况的出现。
这时,我们就可以通过GAUSS投影的分带,解决了投影区域长度变形过大的问题,而在进行坐标换算时,我们也可以通过高斯投影换带来获得统一的坐标系,减少内业计算中的误差。
而GAUSS投影坐标换带计算通过大地坐标(B,L)和平面坐标(x,y)之间的转换,将不同的投影带之间联系了起来。
解决了诸如平面控制网在两相邻带边缘地区并横跨两投影带以及在分界子午线附近测图时要用到相邻带控制点的问题。
从而极大地方便了大地测量工作的进行。
四、程序设计基础
1.流程图设计
坐标系统之间的转换比较复杂,手算工作量巨大,因而各种坐标转换模型相继出现,利用计算机强大的数据计算能力可以轻松应对这些问题,提高工作效率。
流程图如下:
2.语言简介
C语言:C语言是目前世界上流行、使用最广泛的高级程序设计语言。
C语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其它高级语言,许多大型应用软件都是用C语言编写的。
C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画它是数值计算的高级语言。
常用的编译软件有Microsoft Visual C++,Borland C++,Watcom C++ ,Borland C++, Borland C++ Builder,Borland C++ 3.1 for DOS,Watcom C++ 11.0 for DOS,GNU DJGPP C++, Lccwin32 C Compiler 3.1,Microsoft C,High C,等等...... C语言是一门通用计算机编程语言,应用广泛。
C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
C语言的特点
1. 简洁紧凑、灵活方便
C语言一共只有32个关键字,9种控制语句,程序书写自由,主要用小写字母表示。
它把高级语言的基本结构和语句与低级语言的实用性结合起来。
C 语言可以象汇编语言一样对位、字节和地址进行操作, 而这三者是计算机最基本的工作单元。
2. 运算符丰富
C的运算符包含的范围很广泛,共有种34个运算符。
C语言把括号、赋值、强制类型转换等都作为运算符处理。
从而使C的运算类型极其丰富表达式类型多样化,灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。
3. 数据结构丰富
C的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。
能用来实现各种复杂的数据类型的运算。
并引入了指针概念,使程序效率更高。
另外C语言具有强大的图形功能, 支持多种显示器和驱动器。
且计算功能、逻辑判断功能强大。
4. C是结构式语言
结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。
这种结构化方式可使程序层次清晰, 便于使用、维护以及调试。
C语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。
5. C语法限制不太严格、程序设计自由度大
一般的高级语言语法检查比较严,能够检查出几乎所有的语法错误。
而C 语言允许程序编写者有较大的自由度。
6. C语言允许直接访问物理地址,可以直接对硬件进行操作
因此既具有高级语言的功能,又具有低级语言的许多功能,能够象汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元,可以用来写系统软件。
7. C语言程序生成代码质量高,程序执行效率高
一般只比汇编程序生成的目标代码效率低10へ20%。
8. C语言适用范围大,可移植性好
M FC:微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是一个微软公司提供的类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。
其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。
MFC是微软提供的,用于在C++环境下编写应用程序的一个框架和引擎,VC++是Windows下开发人员使用的专业C++ SDK(SDK,Standard SoftWare Develop Kit,专业软件开发平台),MFC就是挂在它之上的一个辅助软件开发包,MFC作为与VC++血肉相连的部分(注意C++和VC++的区别:C++是一种程序设计语言,是一种大家都承认的软件编制的通用规范,而VC++只是一个编译器,或者说是一种编译器+源程序编辑器的IDE,WS,PlatForm,这跟Pascal和Delphi的关系一个道理,Pascal是Delphi的语言基础,Delphi使用Pascal规范来进行Win下应用程序的开发和编译,却不同于Basic语言和VB的关系,Basic语言在VB开发出来被应用的年代已经成了Basic语言的新规范,VB新加的Basic语言要素,如面向对象程序设计的要素,是一种性质上的飞跃,使VB既是一个IDE,又成长成一个新的程序设计语言),MFC同BC++集成的VCL一样是一个非外挂式的软件包,类库,只不过MFC类是微软为VC++专配的.
MFC是Win API与C++的结合,API,即微软提供的Windows下应用程序的编程语言接口,是一种软件编程的规范,但不是一种程序开发语言本身,可以允许用户使用各种各样的第三方(如我是一方,微软是一方,Borland就是第三方)的编程语言来进行对Windows下应用程序的开发,使这些被开发出来的应用程序能在Windows下运行,比如VB,VC++,Java,Delhpi编程语言函数本质上全部源于API,因此用它们开发出来的应用程序都能工作在Windows的消息机制和绘图里,遵守Windows作为一个操作系统的内部实现,这其实也是一种必要,微软如果不提供API,这个世上对Windows编程的工作就不会存在,微软的产品就会迅速从时尚变成垃圾,上面说到MFC是微软对API函数的专用C++封装,这种结合一方面让用户使用微软的专业C++ SDK来进行Windows下应用程序的开发变得容易,因为MFC 是对API的封装,微软做了大量的工作,隐藏了好多程序开发人员在Windows下用C++ & MFC编制软件时的大量内节,如应用程序实现消息的处理,设备环境绘
图,这种结合是以方便为目的的,因此就造成了MFC对类封装中的一定程度的的冗余和迂回。
五、程序界面及源码
界面设计:
部分源码
坐标反算
UpdateData(true);
((CEdit*)GetDlgItem(IDC_EDIT3))->EnableWindow(true);
((CEdit*)GetDlgItem(IDC_EDIT4))->EnableWindow(true);
((CEdit*)GetDlgItem(IDC_EDIT5))->EnableWindow(true);
((CEdit*)GetDlgItem(IDC_EDIT6))->EnableWindow(true);
((CEdit*)GetDlgItem(IDC_EDIT7))->EnableWindow(true);
((CEdit*)GetDlgItem(IDC_EDIT8))->EnableWindow(true);
((CEdit*)GetDlgItem(IDC_EDIT9))->EnableWindow(true);//恢复经纬度对应的编辑框的可用性
double Bf,beta,Z,Nf,b2,b3,b4,b5,l,B,L,Bf2,beta2;
beta=m_X*P/6367558.4969;
beta2=cos(beta/P)*cos(beta/P);
Bf=beta+(50221746+(293622+(2350+22*beta2)*beta2)*beta2)*sin(beta/
P)*cos(beta/P)*P*0.0000000001;
Bf2=cos(Bf/P)*cos(Bf/P);
Nf=6399698.902-(21562.267-(108.973-0.612*Bf2)*Bf2)*Bf2;
Z=m_Y/(Nf*cos(Bf/P));
b2=(0.5+0.003369*Bf2)*sin(Bf/P)*cos(Bf/P);
b3=0.333333-(0.166667-0.001123*Bf2)*Bf2;
b4=0.25+(0.16161+0.00562*Bf2)*Bf2;
b5=0.2-(0.1667-0.0088*Bf2)*Bf2; //参数计算部分
B=Bf-(1-(b4-0.12*Z*Z)*Z*Z)*Z*Z*b2*P;
l=(1-(b3-b5*Z*Z)*Z*Z)*Z*P;
L=m_LO*3600+l;
m_B0=(int)(B/3600);
m_B1=(int)((B-m_B0*3600)/60);
m_B2=B-(m_B0*3600+m_B1*60);
m_L0=(int)(L/3600);
m_L1=(int)((L-m_L0*3600)/60);
m_L2=L-(m_L0*3600+m_L1*60);//单位转换,把秒化成度分秒,再显示
UpdateData(false);
坐标正算:
UpdateData(true);//更新数据
((CEdit*)GetDlgItem(IDC_EDIT1))->EnableWindow(true);
((CEdit*)GetDlgItem(IDC_EDIT2))->EnableWindow(true);//使坐标X,Y 编辑框可用
double B,L,l,N,BB,a0,a3,a4,a5,a6;
L=(m_L0*3600+m_L1*60+m_L2)/P;
B=(m_B0*3600+m_B1*60+m_B2)/P;
BB=cos(B)*cos(B);
l=(m_L0*3600+m_L1*60+m_L2-m_LO*3600)/P;
N=6399698.902-(21562.267-(108.973-0.612*BB)*BB)*BB;
a0=32140.404-(135.3302-(0.7092-0.0040*BB)*BB)*BB;
a3=(0.3333333+0.001123*BB)*BB-0.1666667;
a4=(0.25+0.00252*BB)*BB-0.04166;
a5=0.0083-(0.1667-(0.1968+0.0040*BB)*BB)*BB;
a6=(0.166*BB-0.084)*BB;
m_X=6367558.4969*B-(a0-(0.5+(a4+a6*l*l)*l*l)*l*l*N)*sin(B)*cos(B);
m_Y=(1+(a3+a5*l*l)*l*l)*l*N*cos(B);
UpdateData(false);//释放显示数据
换带计算:
UpdateData(true);
((CEdit*)GetDlgItem(IDC_EDIT10))->EnableWindow(true);
((CEdit*)GetDlgItem(IDC_EDIT12))->EnableWindow(true);
double Bf,beta,Z,Nf,b2,b3,b4,b5,l,B,L,Bf2,beta2;
beta=m_X*P/6367558.4969;
beta2=cos(beta/P)*cos(beta/P);
Bf=beta+(50221746+(293622+(2350+22*beta2)*beta2)*beta2)*sin(beta/ P)*cos(beta/P)*P*0.0000000001;
Bf2=cos(Bf/P)*cos(Bf/P);
Nf=6399698.902-(21562.267-(108.973-0.612*Bf2)*Bf2)*Bf2;
Z=m_Y/(Nf*cos(Bf/P));
b2=(0.5+0.003369*Bf2)*sin(Bf/P)*cos(Bf/P);
b3=0.333333-(0.166667-0.001123*Bf2)*Bf2;
b4=0.25+(0.16161+0.00562*Bf2)*Bf2;
b5=0.2-(0.1667-0.0088*Bf2)*Bf2; //参数计算部分
B=Bf-(1-(b4-0.12*Z*Z)*Z*Z)*Z*Z*b2*P;
l=(1-(b3-b5*Z*Z)*Z*Z)*Z*P;
L=m_LO*3600+l;
m_B0=(int)(B/3600);
m_B1=(int)((B-m_B0*3600)/60);
m_B2=B-(m_B0*3600+m_B1*60);
m_L0=(int)(L/3600);
BB=cos(B1)*cos(B1);
l1=(L-m_XINL0*3600)/P;
N=6399698.902-(21562.267-(108.973-0.612*BB)*BB)*BB;
a0=32140.404-(135.3302-(0.7092-0.0040*BB)*BB)*BB;
a3=(0.3333333+0.001123*BB)*BB-0.1666667;
a4=(0.25+0.00252*BB)*BB-0.04166;
a5=0.0083-(0.1667-(0.1968+0.0040*BB)*BB)*BB;
a6=(0.166*BB-0.084)*BB;
m_XINX=6367558.4969*B1-(a0-
(0.5+(a4+a6*l1*l1)*l1*l1)*l1*l1*N)*sin(B1)*cos(B1);
m_XINY=(1+(a3+a5*l1*l1)*l1*l1)*l1*N*cos(B1)+500000.0;
UpdateData(false);
六、程序验证
已知点
七、软件评价
此基于vc6.0 MFC开发平台开发的高斯投影换带软件能够简洁地完成并解决不同投影带的平面直角坐标换算的问题,但是其计算结果存在误差,主要误差来源如下:
1.程序中所取的π值不是足够的精确
2. 运算过程中经过多次的迭代,导致误差的积累并出现。
3.程序中存在“取整”等命令的存在,会导致数值上存在些微的误差。
八、软件使用说明
1.打开“高斯坐标转换.EXE”
2.界面如下:
3.功能有三个可选:坐标正算、坐标反算、坐标换带。
坐标正算:
坐标反算:
坐标换带:。