高斯投影正反算

合集下载

[转载]高斯正反算

[转载]高斯正反算

[转载]⾼斯正反算

⼤地坐标向笛卡尔坐标转换

⾼斯正反算

采⽤不同椭球实现⾼斯克⾥格投影,将经纬度坐标转换为⾼斯平⾯坐标:正算

⾼斯平⾯坐标转换为不同椭球下的经纬度坐标:反算

1void GaussProjectDirect(double a,double efang,double B,double L,double L0,double& x,double &y,double& R)//⾼斯投影正算克⽒

2 {

3

4double b=aefangtob(a,efang);

5double e2=seconde(a,b);

6double W=sqrt(1-efang*sin(B)*sin(B));printf("W=%f",W);

7double N=a/W;printf("N=%f",N);

8double M=a*(1-efang)/pow(W,3);printf("M=%f",M);

9double t=tee(B);

10double eitef=eitefang(a,b,B);

11double l=L-L0;

12//主曲率半径计算

13double m0,m2,m4,m6,m8,n0,n2,n4,n6,n8;

14 m0=a*(1-efang); n0=a;

15 m2=3.0/2.0*efang*m0; n2=1.0/2.0*efang*n0;

16 m4=5.0/4.0*efang*m2; n4=3.0/4.0*efang*n2;

17 m6=7.0/6.0*efang*m4; n6=5.0/6.0*efang*n4;

高斯投影正反算python代码

高斯投影正反算python代码

高斯投影正反算

1. 什么是高斯投影

高斯投影是一种常用的地图投影方法,它将地球表面的经纬度坐标转换为平面坐标,常用于地理信息系统(GIS)和测绘工程中。高斯投影分为正算和反算两个过程。

•正算:将经纬度坐标转换为平面坐标。

•反算:将平面坐标转换为经纬度坐标。

2. 高斯投影正算

2.1 原理

高斯投影正算的原理是根据椭球体上某一点处的曲率半径、子午线弧长和东西方向上的距离,计算该点在平面上的x、y坐标。

2.2 具体步骤

高斯投影正算的具体步骤如下:

1.根据给定的椭球体参数(长半轴a、短半轴b),计算椭球体第一偏心率e。

2.根据给定的中央子午线经度λ0,计算λ - λ0 的差值Δλ。

3.计算曲率半径N和子午线弧长A0。

4.根据给定的纬度φ和经度λ,计算Δφ和Δλ。

5.计算子午线弧长A1、A2、A3和A4。

6.计算平面坐标x和y。

2.3 Python代码实现

下面是使用Python实现高斯投影正算的示例代码:

import math

# 输入参数

a = 6378137.0 # 长半轴

b = 6356752.314245 # 短半轴

e = math.sqrt(1 - (b/a)**2) # 第一偏心率

λ0 = math.radians(120) # 中央子午线经度,单位为弧度

# 输入经纬度坐标

φ = math.radians(30) # 纬度,单位为弧度

λ = math.radians(121) # 经度,单位为弧度

# 计算Δλ

Δλ = λ - λ0

# 计算曲率半径N和子午线弧长A0

N = a / math.sqrt(1 - e**2 * math.sin(φ)**2)

高斯投影正反算公式

高斯投影正反算公式

⾼斯投影正反算公式

⾼斯投影坐标正反算

⼀、基本思想:

⾼斯投影正算公式就是由⼤地坐标(L ,B )求解⾼斯平⾯坐标(x ,y ),⽽⾼斯投影反算公式则是由⾼斯平⾯坐标(x ,y )求解⼤地坐标(L ,B )。

⼆、计算模型:

基本椭球参数:

椭球长半轴a

椭球扁率f

椭球短半轴:(1)b a f =-

椭球第⼀偏⼼率

:e a

= 椭球第⼆偏⼼率

:e b

'=⾼斯投影正算公式:此公式换算的精度为0.001m

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 ''+-''+''++-''+''?''+

=ρηηρρ 52224255

32233

)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 η'=

1803600ρπ

''=*

其中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

高斯正反算公式

高斯正反算公式

5

5

2

22

4

23

3

2

2

6

6424

44222

2

cos )5814185(120

cos )1(6

cos cos )5861(720

cos )495(24

cos 2

Bl

t t t N Bl t N Bl N y Bl

t t t N Bl t t N Bl t N X x ηηηηη-++-+

+-+=+-+

++-+

+

=

椭圆的第一偏心率:a

b a e 2

2-=

椭圆的第二偏心率:b

b a e 2

2

-=

'

为简化书写,还常引入以下符号:B e B

t 2

22cos tan '==η

子午圈曲率半径:B m B m B m B m m M 886644220sin sin sin sin ++++= 卯酉圈曲率半径:B n B n B n B n n N 886644220sin sin sin sin ++++=

⎪⎪⎪⎪⎪⎪⎩

⎪⎪⎪⎪⎪⎪⎨⎧

=====⎪⎪⎪⎪⎪⎪⎩

⎪⎪⎪⎪⎪⎪⎨⎧====-=6

2

842

622402

206

2842622402

22

08765432189674523)1(n e n n e n n e n n e n a n m e m m e m m e m m e m e a m

子午线弧长:B

a B a B a B a B a X 8sin 8

6sin 6

4sin 4

2sin 2

86420+

-

+

-

=

⎪⎪⎪⎪⎪⎪⎩

⎪⎪⎪⎪⎪⎪⎨⎧

=+

=+

+=++

+=+++

++=128

16

32327163816

732

1522128

3516

58

32888668

6448

6422864200m a m m a m m m a m m m m a m m m m m a

高斯平面直角坐标与大地坐标的相互转换——高斯投影的正算与反算.

高斯平面直角坐标与大地坐标的相互转换——高斯投影的正算与反算.

昆明冶金高等专科学校测绘学院 (4)计算公式
3 2 2 2 4 ( 5 3 t 9 t ) y f f f f 2M f N f 2 4M f N 3 f tf 2 4 6 (6 1 9 0t f 4 5t f ) y 7 2 0M f N 5 f 1 1 2 2 3 l y (1 2t f f ) y 3 N f co s B f 6 N f co s B f 1 2 5 (5 2 8t 2 t4 2 2 f 24 f 6 f 8 f t f )y 5 1 2 0N f co s B f B Bf tf y2 tf
式中:

2 e 2 cos2 B
t 2 tan2 B l (L L0) X为B对应子午线弧长 N为卯酉圈曲率半径 20626 5
昆明冶金高等专科学校测绘学院
2
高斯投影坐标反算公式
(1)高斯投影反算:
已知某点 x, y ,求该点 L, B ,即 x, y ( L, B) 的坐标变换。 (2)投影变换必须满足的条件
当要求转换精度至0.01 时,可简化为下式:
2 2 2 2 4 ( 5 3 t 9 t ) y f f f f 2M f N f 24M f N 3 f 1 1 2 2 3 l y ( 1 2 t ) y f f N f cos B f 6N 3 cos B f f 1 2 4 5 (5 28t f 24t f ) y 120N 5 cos B f f B Bf tf y2 tf

高斯投影正反算原理

高斯投影正反算原理

高斯投影正反算原理

高斯投影是一种常用于地图制图的投影方式,也被广泛应用于其他领域的空间数据处理。高斯投影正反算是对于已知的地球坐标系上的位置(经纬度),通过计算得到该点的平面坐标(东、北坐标),或者对于已知的平面坐标(东、北坐标),通过计算得到该点的地球坐标系上的位置(经纬度)的过程。本文将详细介绍高斯投影正反算的原理。

一、高斯投影简介

高斯投影是一种圆锥投影,其投影面在地球表面的某个经线上,也就是说,投影面是以该经线为轴的圆锥面。经过对圆锥体的调整后,使其切于地球椭球面,在该经线上进行投影,同时保持沿该经线方向的比例尺一致,从而达到地图上各点在包括该经线的垂直面上映射的目的。这种投影方式在某一特定区域内得到高精度的结果,因此广泛应用于地图制图。

二、高斯投影数学模型

对于高斯投影正反算,需要先建立高斯投影坐标系与地球坐标系的转换模型。

1.高斯投影坐标系的建立

高斯投影坐标系的建立需要确定圆锥面的基本参数,首先需要确定其所处的中央子午线,再确定该子午线上的经度为零点,并利用该经线上某一点的经度和该点的高度来确定该点所在的圆锥体。

圆锥体的底面包括所有与地球椭球面相切的圆面,通过对这些圆面进行调整,使得圆锥体转动后能够在中央子午线上进行投影。在此基础上,可建立高斯投影坐标系,其中投影面为圆锥面,且中央子午线与投影面的交点称为该投影坐标系的中心,投影面的上端点和下端点分别对应正北方向和正南方向。

2.地球坐标系的建立

地球坐标系是以地球椭球体为基础建立的,其坐标系原点确定为地球椭球体上的一个特定点。在已知该点经纬度和高度的前提下,可确定以该点为中心的地球椭球体,并可根据它与地球坐标系之间的转换关系得到平面坐标系。

高斯投影坐标正反算公式

高斯投影坐标正反算公式

§8.3高斯投影坐标正反算公式

任何一种投影①坐标对应关系是最主要的;②假设是正形投影,除了满足正形投影的条件外〔C-R 偏微分方程〕,还有它本身的特殊条件。 高斯投影坐标正算公式: B,l ⇒ x,y

高斯投影必须满足以下三个条件:

①中央子午线投影后为直线;②中央子午线投影后长度不变;③投影具有正形性质,即正形投影条件。

由第一条件知中央子午线东西两侧的投影必然对称于中央子午线,即

(8-10)式中,x 为l 的偶函数,y 为l 的奇函数;0330

'≤l ,即20/1/≈''''ρl ,

如展开为l 的级数,收敛。

+++=++++=553316644220l m l m l m y l m l m l m m x 〔8-33〕

式中 ,,10m m 是待定系数,它们都是纬度B 的函数。 由第三个条件知:

q

y

l x l y q x ∂∂-=∂∂∂∂=∂∂, (8-33)式分别对l 和q 求偏导数并代入上式

----=++++++=+++553315

63424

42204

52

3164253l dq

dm l dq dm l dq dm l m l m l m l dq

dm l dq dm dq dm l m l m m (8-34) 上两式两边相等,其必要充分条件是同次幂l 前的系数应相等,即

dq dm m dq

dm m dq

dm m 231

20

13121⋅

=⋅

-==

(8-35)

(8-35)是一种递推公式,只要确定了

0m 就可依次确定其余各系数。

由第二条件知:位于中央子午线上的点,投影后的纵坐标x 应等于投影前从赤道量至该点的子午线弧长X ,即(8-33)式第一式中,当0=l

高斯投影正反算

高斯投影正反算

高斯投影正、反算及换带

程序执行条件

※数组投影选择

T、换算点个数“Z=0 F≠0”、=0正算0、≠0反算

※坐标系选择

“54 ≠54”、=54换算为1954年北京坐标系输入54、≠54换算为1988年西安坐标系

M、中央子午线经度(°′″)

输入

※大地坐标

I、序列号

B、L:大地纬度和经度(地理坐标)(°′″)

※高斯平面坐标轴子午线

I、序列号

X、Y:高斯平面坐标(m) Z、轴子午线(°)

输出

※大地坐标子午收敛角

N、序列号

B、L:大地纬度和经度(地理坐标)(°′″) R、子午收敛角(°′″)

※高斯平面坐标子午收敛角

N、序列号

X、Y:高斯平面坐标(m) R、子午收敛角(°′″)

注:

1、程序执行前必须进行数组定位。如:Defm 10 T×2=5×2=10

2、Y坐标值要去掉带号及避免出现负值的500公里;

4、本程序运算时,各已知数据、观测变量不会随之变化,可非常方便地进行各数据的核对;

5、本程序在进行换带计算时采用的是间接换带计算法。

Prog GSXY

Defm 10:TA“Z=0 F≠0”G“54 ≠54”Z:Fixm:I=0:「b」0:I=I+1◢

J=2I-1:M=Z[J:L=Z[J+1:A=0=>Prog“3”:B=M:M=L+Z:Prog“3”:L=M:{BL}:M=B:Prog“2”: B=M:M=L:Prog“2”:L=M-Z:≠>X=M:Y=L:{XY}:B=X:L=Y⊿Z[J]=B:Z[J+1]=L:IGoto 0⊿G=54=>C=6399698.90178271:E=.006738525414684:≠>C=6399596.65198801:E=.006 739501819473⊿I=0:「b」0:I“N”=I+1◢

高斯平面直角坐标系

高斯平面直角坐标系
简称为:等角条件、对称条件、正长条件
大地测量学基础
4.9 高斯平面直角坐标系 三、高斯投影坐标正反算公式
3、高斯投影坐标正算公式 (1)公式推导基本思路 高斯投影是按带投影的, 任一点的投影,只要看它 属哪一带,确定出中央子午线经度就可以了,故投影 只与经差有关了。
变为:
大地测量学基础
4.9 高斯平面直角坐标系 三、高斯投影坐标正反算公式
大地测量学基础
4.9 高斯平面直角坐标系 三、高斯投影坐标正反算公式
即有:
在数学上,F1为 l 的偶函数,F2为 l 的奇函数。 因为在每带中,l/ρ˝不大,是一个微小量,可展成幂级 数。
m0,m1,m2,…,是待定系数,它们都是纬度B的函 数。
大地测量学基础
4.9 高斯平面直角坐标系 三、高斯投影坐标正反算公式
大地测量学基础
C、根据等式两边同次幂的系数相等
等角条件:
y r x l M B x r y l M B
比较等式两边同次幂的系数
r dm0 m1 M dB 1 r dm2 m3 3 M dB
mk 1
k 1
1 r dm1 m2 2 M dB
大地测量学基础
4.9 高斯平面直角坐标系 三、高斯投影坐标正反算公式
4、高斯投影坐标反算公式 (1)为什么要进行高斯投影反算: ①检核正算的正确性; ②有时只有平面坐标,需要大地坐标时需转化; ③在天文大地网平差时,为避免换带的麻烦,可在椭 球面上进行,需要已知的B、L。 投影方程为:

高斯正反算程序

高斯正反算程序

高斯正反算程序

高斯正反算程序是一种用于计算地理坐标和直角坐标之间转换的程序。它基于高斯投影原理,将地球表面上的点投影到平面上,实现地理坐标和直角坐标之间的转换。

高斯正算程序是将地理坐标(经度和纬度)转换为直角坐标(X 和Y)的程序。其计算步骤包括:

1. 将经度和纬度转换为弧度;

2. 计算经度余弦、纬度正弦和纬度余弦;

3. 计算X和Y坐标。

高斯反算程序是将直角坐标(X和Y)转换为地理坐标(经度和纬度)的程序。其计算步骤包括:

1. 计算X和Y坐标的平方和;

2. 计算平方差;

3. 计算经度和纬度的弧度值;

4. 将弧度值转换为度数。

以上是高斯正反算程序的基本步骤,具体的计算公式和细节可能因不同的投影方法和地区而有所不同。在实际应用中,需要根据具体情况选择合适的投影方法和参数进行计算。

高斯投影坐标反算公式

高斯投影坐标反算公式

为止
3、计算反算公式中的各符号的值
t f tan B f
2 e'2 cos 2 B f f
W f 1 e 2 sin 2 B f
a(1 e 2 ) Mf W f3
a Nf Wf
பைடு நூலகம்
4、代入反算公式计算经度差、纬度
1 1 l y 1 2t 2 2 y 3 f f 3 N f cos B f 6 N cos B f 1 5 28t 2 24t 4 y 5 f f 5 120N f cos B f
2、迭代法求取大地纬度 迭代开始时设
B X a0
1 f
以后每次迭代按下式计算
a6 a2 a4 i i F ( B ) sin2B f sin4B f sin6Bif 2 4 6
i f
Bif1 ( X F ( Bif )) a0
重复迭代直至 B if1 B if
L L0 l
小结
• • • • 了解反算公式的推导思路; 掌握反算公式保符号的意义; 用反算公式会进行计算; 掌握子午线收敛角的定义及作用;
作业与思考
1、通过高斯反算,验证上次作业的正确性。 2、高斯反算公式推导思路是什么?中各符号的意义是什么? 3、子午线收敛角的作用是什么?
本节主要内容
• • • • • 高斯投影坐标反算公式 坐标反算公式的几何解释 平面子午线收敛角的定义 平面子午线收敛角的公式推导 实用公式

第20次课-高斯投影坐标正算公式

第20次课-高斯投影坐标正算公式





1 x N cos B N cos3 B 1 t 2 2 3 6 1 N cos5 B5 18t 2 t 4 14 2 58t 2 2 5 120 1 来自百度文库 N cos7 B61 479t 2 179t 4 t 6 7 5040
可得
dm0 dm0 dB dX dB dq dB dq dB dq N cos B M N cos B M
c m1 N cos B cos B V

dm1 dq
依次类推可得
dm1 dm1 dB c sin B cos B dq dB dq V N m2 sin B cos B 2
x
2.坐标正算公式的几何解释 正算公式: x X X l 0,x X l 0,x X 以 P '点为核心,在中央子午线上 P点展开 ' l 的幂级数
求y
P(L,B)
X
求x P'(0, B) X O 平行圈
y
高斯坐标正算实用步骤
1、根据经纬度计算中央子午经度和带号及经度差 (点到中央子午线的距离)
dm0 1 dm1 1 dm2 m1 , m2 , m3 dq 2 dq 3 dq
dm0 只要求出 m1 , m2 , m3, 即可。焦点在于求 dq , 即 m0的表达式

高斯投影正反算

高斯投影正反算

高斯投影正反算

学院:资源与环境工程工程学院

专业:测绘工程 学号:X51414012 姓名:孙超

一、高斯投影概述

想象有一个椭圆柱面横套在地球椭球体外面,并与某一条子午线相切,椭圆柱的中心轴通过椭球体的中心,然后用一定投影方法,将中央子午线两侧各一定经差范围内的地区投影到椭圆柱面上,再将此柱面展开即成为投影面。高斯投影由于是正形投影,故保证了投影的角度不变性,图形的相似性以及在某点各方向上长度比的同一性。由于采用了同样法则的分带投影,这即限制了长度变形,又保证了在不同投影带中采用相同的简便公式和数表进行变形引起的各项改正的计算,并且带与带间的互相换算也能用相同的公式和方法进行。高斯投影的这些优点必将使它得到广泛的推广和具有国际意义。

二、高斯投影坐标正算公式

1.高斯投影必须满足以下三个条件 1)中央子午线投影后为直线 2)中央子午线投影后长度不变 3)投影具有正形性质,即正形投影条件

2.高斯正算公式推导

1)由第一个条件可知,由于地球椭球体是一个旋转椭球体,所以高斯投影必然有这样一个性质,即中央子午线东西两侧的投影必然对称于中央子午线。 2)由于高斯投影是换带投影,在每带内经差l是不大的,l

ρ是一个微小量,所以

可以将

X=X (l,q ),Y=Y (l ,q )

展开为经差为l 的幂级数,它可写成如下的形式

X=m 0+m 2l 2+m 4l 4

+…

Y=m 1l+m 3l 2+m 5l 5

+…

式中m 0,m1,m2,…是待定系数,他们都是纬度B 的函数。 3)由第三个条件:∂y ∂l =∂x ∂q 和∂x ∂l =-∂y

「高斯投影坐标正反算公式及适合电算的高斯投影公式」

「高斯投影坐标正反算公式及适合电算的高斯投影公式」

「高斯投影坐标正反算公式及适合电算的高斯投影公式」高斯投影坐标正反算公式是用于计算高斯投影坐标的数学公式。高斯

投影坐标是一种地理坐标系统,常用于测量和测绘工作中。

高斯投影坐标正算是指已知一个点的经纬度坐标,通过公式计算出该

点的高斯投影坐标。而高斯投影坐标反算是指已知一个点的高斯投影坐标,通过公式计算出该点的经纬度坐标。

一、高斯投影坐标正算公式:

已知一个点的经纬度坐标(φ,λ),其中φ为纬度,λ为经度,以

及椭球体参数a、f和中央经线经度L0,可以通过以下步骤计算出该点的

高斯投影坐标(X,Y):

1.计算扁率f':

f'=(a-b)/a

其中,b=a*(1-f)是椭球体的短半轴。

2.计算黄赤交角ε:

ε = atan(b / a)

3.计算辅助量t:

t = tan(π/4 - φ/2) / [(1 - f' * sin²φ)⁰.⁵ * (1 + e' *

sinφ)⁰.⁵]

其中,e'=f'*(2-f')是椭球体的第一偏心率。

4.计算辅助量η:

η = e'^2 * cos²φ

5.计算系数A、B、C和D:

A = (L - L0) * cosφ

C = (L - L0) * cos⁵φ * (5 - tan²φ + 9e'^² + 4e'^⁴ - 24e'^² * tan²φ - 45e'^⁴ * tan²φ)

D = (L - L0) * cos⁷φ * (61 - 58tan²φ + tan⁴φ + 270e'^² - 330e'^² * tan²φ)

6.计算高斯坐标X和Y:

X=k0*a*(A+B/2+C/4+D/6)

高斯投影正反算编程一.高斯投影正反算基本公式

高斯投影正反算编程一.高斯投影正反算基本公式

高斯投影正反算编程一.高斯投影正反算基本公式

(1)高斯正算基本公式

(2)高斯反算基本公式

以上主要通过大地测量学基础课程得到,这不进行详细的推导,只是列出基本公式指导编程的进行。

二.编程的基本方法和流程图

(1)编程的基本方法

高斯投影正反算基本上运用了所有的编程基本语句,本文中是利用C++语言进行基本的设计。高斯正算中对椭球参数和带宽的选择主要运用了选择语句。而高斯反算中除了选择语句的应用,在利用迭代算法求底点纬度还应用了循环语句。编程中还应特别注意相关的度分秒和弧度之间的相互转换,这是极其重要的。

(2)相关流程图

1)正算

2)反算

三.编程的相关代码(1)正算

# include "stdio.h"

# include "stdlib.h"

# include "math.h"

# include "assert.h"

#define pi (4*atan(1.0))

int i;

struct jin

{

double B;

double L;

double L0;

};

struct jin g[100];

main(int argc, double *argv[])

{

FILE *r=fopen("a.txt","r");

assert(r!=NULL);

FILE *w=fopen("b.txt","w");

assert(r!=NULL);

int i=0;

while(fscanf(r,"%lf %lf %lf",&g[i].B,&g[i].L,&g[i].L0)!=EOF)

{

double a,b;

int zuobiao;

9、高斯投影

9、高斯投影

高斯投影长度比与长度变形
高斯投影尽管保持投影后角度不变,但不能保 持长度不变,有些长度变形还会很大,严重制 约其应用范围。下面首先研究高斯投影的长度 比和长度变形
x 2 y 2 x 2 y 2 1 1 2 m 2 2 N cos B q q N cos B l l
为了求定x及y对于l偏导数,利用下列公式 l2 l4 3 2 2 x X N sin B cos B N sin B cos B(5 t 9 ) 2 24 3 5 l l 3 2 2 y lN cos B N cos B(1 t ) N cos5 B(5 18t 2 t 4 ) 6 120
即当l 0时,x m0 X X 为自赤道量起到该点处的子午线弧长
高斯投影坐标正算
高斯投影坐标正算
N N 2 x X sin B cos Bl sin B cos3 B(5 t 2 9 2 4 4)l 4 2 24 N sin B cos5 B(61 58t 2 t 4 )l 6 720 N y N cos Bl cos3 B(1 t 2 2 )l 3 6 N cos5 B(5 18t 2 t 4 14 2 58t 2 2 )l 5 120
1、等面积投影 ab = 1 2、等角投影 a=b
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
public static void xy_BL(double x, double y, out double B, out double L, double a,double f, int beltWidth)
{
//如果为假定坐标,转换为自然坐标
int beltNum = 0;
if (y > 1000000)
}
/// <summary>
///从大地坐标到平面坐标的高斯正算
///
///默认的是六度带投影
/// </summary>
/// <param name="B">大地纬度</param>
/// <param name="L">大地经度</param>
/// <param name="x">平面纵轴</param>
{
double ee = (2 * f - 1) / f / f; //第一偏心率的平方
double ee2 = ee / (1 - ee); //第二偏心率的平方
double rB, tB, m;
rB = B * Math.PI / 180;
tB = Math.Tan(rB);
m = Math.Cos(rB) * dL * Math.PI / 180;
public static void BL_xy(double B, double L, out double x, out double y, double a, double f, int beltWidth, bool assumedCoord)
{
int beltNum; //投影分带的带号
beltNum = (int)Math.Ceiling((L - (beltWidth == 3 ? 1.5 : 0)) / beltWidth);
/// <param name="B">大地纬度</param>
/// <param name="L">大地经度</param>
/// <param name="CenterL">中央子午线</param>
/// <param name="x">平面纵轴</param>
/// <param name="y">平面横轴</param>
//换算成假定坐标,平移500km,前面加带号
if (assumedCoord) y += 500000 + beltNum * 1000000;
}
/// <summary>
///从大地坐标到平面坐标的高斯正算
///
///指定中央子午线,用于进行邻带换算,此时必不使用假定坐标
/// </summary>
if (beltWidth == 3 && beltNum * 3 == L - 1.5) beltNum += 1;
L -= beltNum * beltWidth - (beltWidth == 6 ? 3 : 0);
Bl_xy(B, L, out x, out y, a, f, beltWidth);
x = MeridianLength(B, a, f) + N * tB * x;
y = N * (m + (1 - tB * tB + it2) * Math.Pow(m, 3) / 6 + (5 - 18 * tB * tB + Math.Pow(tB, 4) + 14 * it2 - 58 * tB * tB * it2) * Math.Pow(m, 5) / 120);
class Gauss
{
#region高斯投影正反算
/// <summary>
///从大地坐标到平面坐标的高斯正算
///
///默认的是使用假定坐标的六度带投影
/// </summary>
/// <param name="B">大地纬度</param>
/// <param name="L">大地经度</param>
cA = 1 + 3 * ee / 4 + 45 * ee * ee / 64 + 175 * Math.Pow(ee, 3) / 256 + 11025 * Math.Pow(ee, 4) / 16384;
cB = 3 * ee / 4 + 15 * ee * ee / 16 + 525 * Math.Pow(ee, 3) / 512 + 2205 * Math.Pow(ee, 4) / 2048;
{
BL_xy(B, L, out x, out y, a, f, 6, true);
}
/// <summary>
///从大地坐标到平面坐标的高斯正算
///
///默认的是使用假定坐标
/// </summary>
/// <param name="B">大地纬度</param>
/// <param name="L">大地经度</param>
/// <param name="L">大地经度</param>
/// <param name="a">参考椭球长半轴</param>
/// <param name="f">参考椭球扁率倒数</param>
public static void xy_BL(double x, double y, out double B, out double L, double a, double f)
}
/// <summary>
///平面坐标(自然坐标)到大地坐标的高斯反算
/// </summary>
/// <param name="x">平面纵轴</param>
/// <param name="y">平面横轴</param>
/// <param name="B">大地纬度</param>
/// <param name="l">经度差</param>
/// <param name="a">参考椭球长半轴</param>
/// <param name="f">参考椭球扁率倒数</param>
/// <param name="beltWidth">投影分带的带宽</param>
private static void xy_Bl(double x, double y, out double B, out double l, double a, double f, int beltWidth)
/// <param name="B">大地纬度</param>
/// <param name="L">大地经度</param>
/// <param name="a">参考椭球长半轴</param>
/// <param name="f">参考椭球扁率倒数</param>
/// <param name="beltWidth">投影分带的带宽</param>
}
/// <summary>
///从大地坐标到平面坐标的高斯正算
/// </summary>
/// <param name="B">大地纬度</param>
/// <param name="L">大地经度</param>
/// <param name="x">平面纵轴</param>
/// <param name="y">平面横轴</param>
double N = a / Math.Sqrt(1 - ee * Math.Sin(rB) * Math.Sin(rB));
double it2 = ee2 * Math.Pow(Math.Cos(rB), 2);
x = m * m / 2 + (5 - tB * tB + 9 * it2 + 4 * it2 * it2) * Math.Pow(m, 4) / 24 + (61 - 58 * tB * tB + Math.Pow(tB, 4)) * Math.Pow(m, 6) / 720;
/// <param name="a">参考椭球长半轴</param>
/// <param name="f">参考椭球扁率倒数</param>
/// <param name="beltWidth">投影分带的带宽</param>
public static void Bl_xy(double B, double dL, out double x, out double y, double a, double f, int beltWidth)
/// Hale Waihona Puke Baiduparam name="x">平面纵轴</param>
/// <param name="y">平面横轴</param>
/// <param name="a">参考椭球长半轴</param>
/// <param name="f">参考椭球扁率倒数</param>
/// <param name="beltWidth">投影分带的带宽</param>
}
/// <summary>
///平面坐标(自然坐标或假定坐标)到大地坐标的高斯反算
///
///默认使用六度带
/// </summary>
/// <param name="x">平面纵轴</param>
/// <param name="y">平面横轴</param>
/// <param name="B">大地纬度</param>
/// <param name="y">平面横轴</param>
/// <param name="a">参考椭球长半轴</param>
/// <param name="f">参考椭球扁率倒数</param>
/// <param name="assumedCoord">是否使用假定坐标</param>
/// <param name="a">参考椭球长半轴</param>
/// <param name="f">参考椭球扁率倒数</param>
/// <param name="beltWidth">投影分带的带宽</param>
/// <param name="assumedCoord">是否使用假定坐标</param>
{
if (y > 1000000)
{
throw new Exception("坐标类型错误,应使用自然坐标");
}
double ee = (2 * f - 1) / f / f; //第一偏心率的平方
double ee2 = ee / (1 - ee); //第二偏心率的平方
double cA, cB, cC, cD, cE;
{
xy_BL(x, y, out B, out L, a, f, 6);
}
/// <summary>
///平面坐标(自然坐标或假定坐标)到大地坐标的高斯反算
/// </summary>
/// <param name="x">平面纵轴</param>
/// <param name="y">平面横轴</param>
public static void BL_xy(double B, double L, out double x, out double y, double a, double f, bool assumedCoord)
{
BL_xy(B, L, out x, out y, a, f, 6, assumedCoord);
{
beltNum = (int)Math.Ceiling(y / 1000000) - 1;
y -= 1000000 * beltNum + 500000;
}
//求解纬度与经差
xy_Bl(x, y, out B, out L, a, f, beltWidth);
//求解经度
L += beltWidth * beltNum - ((beltWidth == 6) ? 3 : 0);
/// <param name="x">平面纵轴</param>
/// <param name="y">平面横轴</param>
/// <param name="a">参考椭球长半轴</param>
/// <param name="f">参考椭球扁率倒数</param>
public static void BL_xy(double B, double L, out double x, out double y, double a, double f)
public static void BL_xy(double B, double L, out double x, out double y, double a, double f, int beltWidth)
{
BL_xy(B, L, out x, out y, a, f, beltWidth, true);
相关文档
最新文档