1.窗口

2.Form
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
End Sub
'这里是正算
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim i, j, k, a, b, x, h, f, g As Double
If ComBox1.Text = "克拉索夫斯基椭球" Then
eff = 0.006738525414683
c = 6399698.901782711
e2 = 0.006693421622966
ElseIf ComBox1.Text = "1975年国际椭球" Then
eff = 0.006739501819473
c = 6399596.6519880109
e2 = 0.006694384999588
ElseIf ComBox1.Text = "WGS-84椭球" Then
eff = 0.00673949674227
c = 6399593.6258
e2 = 0.00669437999013
ElseIf ComBox1.Text = "CGCS2000" Then
eff = 0.00673949677548
c = 6399593.6259
e2 = 0.0066943800229
End If
'输入变量
B1 = Math.Abs(Val(B11.Text)) + Val(B12.Text) / 60 + Val(B13.Text) / 3600
If Val(B11.Text) > 0 Then
B1 = B1
Else B1 = -B1
End If
L1 = Math.Abs(Val(L11.Text)) + Val(L12.Text) / 60 + Val(L13.Text) / 3600
If Val(L11.Text) > 0 Then
L1 = L1
Else : L1 = -L1
End If
A1 = Math.Abs(Val(A7.Text)) + Val(A8.Text) / 60 + Val(A9.Text) / 3600
If (Val(A7.Text) > 0) Then
A1 = A1
Else A1 = -A1
End If '将度分秒转化成十进制的度数
S = Val(SS.Text)
'计算起点的归化纬度
Dim W1, SinU1, CosU1 As Double
W1 = Math.Sqrt(1 - e2 * (Math.Sin(B1 / 180 * Math.PI)) ^ 2)
SinU1 = Math.Sin(B1 / 180 * Math.PI) * Math.Sqrt(1 - e2) / W1
CosU1 = Math.Cos(B1 / 180 * Math.PI) / W1
'计算辅助函数值
Dim SinA0, Cotσ1, Sin2σ1, Cos2σ1 As Double
SinA0 = CosU1 * Math.Sin(A12 / 180 * Math.PI)
Cotσ1 = CosU1 * Math.Cos(A12 / 180 * Math.PI) / SinU1
Sin2σ1 = 2 * Cotσ1 / ((Cotσ1) ^ 2 + 1)
Cos2σ1 = ((Cotσ1) ^ 2 - 1) / ((Cotσ1) ^ 2 + 1)
'计算系数A,B,C及α,β之值Dim A, B, C, α, β As Double
a = 6356863.02 + (10708.949 - 13.474 * (1 - (SinA0) ^ 2)) * (1 - (SinA0) ^ 2)
b = (5354.469 - 8.978 * (1 - (SinA0) ^ 2)) * (1 - (SinA0) ^ 2)
c = (2.238 * (1 - (SinA0) ^ 2)) * (1 - (SinA0) ^ 2) + 0.006
α = 691.46768 - (0.58143 - 0.00144 * (1 - (SinA0) ^ 2)) * (1 - (SinA0) ^ 2)
β = (0.2907 - 0.001 * (1 - (SinA0) ^ 2)) * (1 - (SinA0) ^ 2)
'计算球面长度
Dim σ0, Sin2σ1σ0, Cos2σ1σ0, σ As Double
σ0 = (S - (b + c * Cos2σ1) * Sin2σ1) * (1 / a)
Sin2σ1σ0 = Sin2σ1 * Math.Cos(2 * σ0) + Cos2σ1 * Math.Sin(2 * σ0)
Cos2σ1σ0 = Cos2σ1 * Math.Cos(2 * σ0) - Sin2σ1 * Math.Sin(2 * σ0)
σ = σ0 + (b + 5 * c * Cos2σ1σ0) * Sin2σ1σ0 / a
'计算经度差改正数Dim δ As Double
δ = (α * σ + β * (Sin2σ1σ0 - Sin2σ1)) * SinA0
'计算终点大地坐标及方位角
Dim SinU2, B2, λ0, λ, L2, A2 As Double
SinU2 = SinU1 * Math.Cos(σ) + CosU1 * Math.Cos(A12 / 180 * Math.PI) * Math.Sin(σ)
B2 = Math.Atan(SinU2 / (Math.Sqrt(1 - e2) * Math.Sqrt(1 - (SinU2) ^ 2))) / Math.PI * 180
λ0 = Math.Atan((Math.Sin(A12 / 180 * Math.PI) * Math.Sin(σ)) / ((CosU1 * Math.Cos(σ)) - (SinU1 *
Math.Sin(σ) * Math.Cos(A12 / 180 * Math.PI)))) / Math.PI * 180
If (Math.Sin(A12 / 180 * Math.PI) > 0) And (Math.Tan(λ0 / 180 * Math.PI) > 0) Then
λ = Math.Abs(λ0)
ElseIf (Math.Sin(A12 / 180 * Math.PI) > 0) And (Math.Tan(λ0 / 180 * Math.PI) < 0) Then
λ = 180 - Math.Abs(λ0)
ElseIf (Math.Sin(A12 / 180 * Math.PI) < 0) And (Math.Tan(λ0 / 180 * Math.PI) < 0) Then
λ = -Math.Abs(λ0)
ElseIf (Math.Sin(A12 / 180 * Math.PI) < 0) And (Math.Tan(λ0 / 180 * Math.PI) > 0) Then
λ = Math.Abs(λ0) - 180
End If
L2 = L1 + λ - δ / 3600
A2 = Math.Atan((CosU1 * Math.Sin(A12 / 180 * Math.PI)) / ((CosU1 * Math.Cos(σ) * Math.Cos(A12 / 180 * Math.PI)) - (SinU1 * Math.Sin(σ)))) / Math.PI * 180
If (Math.Sin(A12 / 180 * Math.PI) < 0) And (Math.Tan(A2 / 180 * Math.PI) > 0) Then
A2 = Math.Abs(A2)
ElseIf (Math.Sin(A12 / 180 * Math.PI) < 0) And (Math.Tan(A2 / 180 * Math.PI) < 0) Then
A2 = 180 - Math.Abs(A2)
ElseIf (Math.Sin(A12 / 180 * Math.PI) > 0) And (Math.Tan(A2 / 180 * Math.PI) > 0) Then
A2 = 180 + Math.Abs(A2)
ElseIf (Math.Sin(A12 / 180 * Math.PI) > 0) And (Math.Tan(A2 / 180 * Math.PI) < 0) Then
A2 = 360 - Math.Abs(A2)
End If
'将B2,L2,A2转化成标准角度,输出时把十进制转化成60进制
i = Math.Truncate(B2)
j = Math.Truncate((B2 - i) * 60)
k = Math.Truncate((((B2 - i) * 60) - j) * 60)
a = Math.Truncate(L2)
b = Math.Truncate((L2 - a) * 60)
x = Math.Truncate((((L2 - a) * 60) - b) * 60)
h = Math.Truncate(A2)
f = Math.Truncate((A2 - h) * 60)
g = Math.Truncate((((A2 - h) * 60) - f) * 60)
B21.Text = CStr(i)
B22.Text = CStr(j)
B23.Text = CStr(k)
L21.Text = CStr(a)
L22.Text = CStr(b)
L23.Text = CStr(x)
A4.Text = CStr(h)
A5.Text = CStr(f)
A6.Text = CStr(g)
End Sub
'这里是反算
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim eff, e2, B1, B2, L1, L2 As Double
Dim i, j, k, a, b, x, h, f, g As Double
If ComBox1.Text = "克拉索夫斯基椭球" Then
eff = 0.006738525414683
e2 = 0.006693421622966
ElseIf ComBox1.Text = "1975年国际椭球" Then
eff = 0.006739501819473
e2 = 0.006694384999588
ElseIf ComBox1.Text = "WGS-84椭球" Then
eff = 0.00673949674227
e2 = 0.00669437999013
ElseIf ComBox1.Text = "CGCS2000" Then
eff = 0.00673949677548
e2 = 0.0066943800229
End If
'输入
B1 = Math.Abs(Val(B11.Text)) + Val(B12.Text) / 60 + Val(B13.Text) / 3600
If (Val(B11.Text) > 0) Then
B1 = B1
Else : B1 = -B1
End If
Ll = Math.Abs(Val(L11.Text)) + Val(L12.Text) / 60 + Val(L13.Text) / 3600
If (Val(L11.Text) > 0) Then
Ll = Ll
Else : L1 = -Ll
End If
B2 = Math.Abs(Val(B21.Text)) + Val(B22.Text) / 60 + Val(B23.Text) / 3600
If (Val(B21.Text) > 0) Then
B2 = B2
Else : B2 = -B2
End If
L2 = Math.Abs(Val(L21.Text)) + Val(L22.Text) / 60 + Val(L23.Text) / 3600
If (Val(L21.Text) > 0) Then
L2 = L2
Else : L2 = -L2
End If
'2 计算辅助函数值
Dim W1, W2, SinU1, SinU2, CosU1, CosU2 As Double
W1 = Math.Sqrt(1 - e2 * (Math.Sin(B1 / 180 * Math.PI)) ^ 2)
W2 = Math.Sqrt(1 - e2 * (Math.Sin(B2 / 180 * Math.PI)) ^ 2)
SinU1 = Math.Sin(B1 / 180 * Math.PI) * Math.Sqrt(1 - e2) / W1
SinU2 = Math.Sin(B2 / 180 * Math.PI) * Math.Sqrt(1 - e2) / W2
CosU1 = Math.Cos(B1 / 180 * Math.PI) / W1
CosU2 = Math.Cos(B2 / 180 * Math.PI) / W2
Dim L, AX1, AX2, BX1, BX2 As Double
L = L2 - L1
AX1 = SinU1 * SinU2
AX2 = CosU1 * CosU2
BX1 = CosU1 * SinU2
BX2 = SinU1 * CosU2
'③运用逐次趋近法同时计算起算点大地方位角,球面长度及经差λ=L+δ
Dim pp, q, A1, λ, δ0, δ As Double
Dim Sinσ, Cosσ, σ As Double
Dim SinA0, xx, α, β As Double
δ0 = 1
Do While Math.Abs(δ - δ0) > 0.000001
δ0 = δ
λ = L + δ0
pp = CosU2 * Math.Sin(λ / 180 * Math.PI)
q = BX1 - BX2 * Math.Cos(λ / 180 * xx)
A1 = Math.Atan(pp / q) / Math.PI * 180
If (pp > 0) And (q > 0) Then
A1 = Math.Abs(A1)
ElseIf (pp > 0) And (q < 0) Then
A1 = 180 - Math.Abs(A1)
ElseIf (pp < 0) And (q < 0) Then
A1 = 180 + Math.Abs(A1)
ElseIf (pp < 0) And (q > 0) Then
A1 = 360 - Math.Abs(A1)
End If
Sinσ = pp * Math.Sin(A1 / 180 * Math.PI) + q * Math.Cos(A1 / 180 * Math.PI)
Cosσ = AX1 + AX2 * Math.Cos(λ / 180 * Math.PI)
σ = Math.Atan(Sinσ / Cosσ) / Math.PI * 180
If (Cosσ > 0) Then
σ = Math.Abs(σ)
ElseIf (Cosσ < 0) Then
σ = 180 - Math.Abs(σ)
End If
SinA0 = CosU1 * Math.Sin(A1 / 180 * Math.PI)
xx = 2 * AX1 - (1 - SinA0 ^ 2) * Cosσ
α = (33523299 - (28189 - 70 * (1 - SinA0 ^ 2)) * (1 - SinA0 ^ 2)) * 10 ^ (-10)
β = (28189 - 94 * (1 - SinA0 ^ 2)) * 10 ^ (-10)
δ = (α * σ - β * xx * Sinσ) * SinA0
Loop
δ = δ * 3600
'④计算系数A,B,C及大地线长度S
Dim AA, BB, C As Double
AA = 6356863.02 + (10708.949 - 13.474 * (1 - (SinA0) ^ 2)) * (1 - (SinA0) ^ 2)
BB = 10708.938 - 17.956 * (1 - (SinA0) ^ 2)
C = 4.487
Dim y, S As Double
y = (((1 - (SinA0) ^ 2)) ^ 2 - 2 * xx ^ 2) * Cosσ
S = AA * (σ / 180 * Math.PI) + (BB * xx + C * y) * Sinσ
Dim A2 As Double
A2 = Math.Atan((CosU1 * Math.Sin(λ / 180 * Math.PI)) / (BX1 * Math.Cos(λ / 180 * Math.PI) - BX2)) / Math.PI * 180
If (Math.Sin(A1 / 180 * Math.PI) < 0) And (Math.Tan(A2 / 180 * Math.PI) > 0) Then
A2 = Math.Abs(A2)
ElseIf (Math.Sin(A1 / 180 * Math.PI) < 0) And (Math.Tan(A21 / 180 * Math.PI) < 0) Then
A2 = 180 - Math.Abs(A2)
ElseIf (Math.Sin(A1 / 180 * Math.PI) > 0) And (Math.Tan(A21 / 180 * Math.PI) > 0) Then
A2 = 180 + Math.Abs(A2)
ElseIf (Math.Sin(A1 / 180 * Math.PI) > 0) And (Math.Tan(A2 / 180 * Math.PI) < 0) Then
A2 = 360 - Math.Abs(A2)
End If
'⑥将A1, A2转化成标准角度
i = Math.Truncate(A1)
j = Math.Truncate((A1 - i) * 60)
k = Math.Truncate((((A1 - i) * 60) - j) * 60)
h = Math.Truncate(A2)
f = Math.Truncate((A2 - h) * 60)
g = Math.Truncate((((A2 - h) * 60) - f) * 60)
A7.Text = CStr(i)
A8.Text = CStr(j)
A9.Text = CStr(k)
SS.Text = CStr(S)
A_1.Text = CStr(h)
A_2.Text = CStr(f)
A3.Text = CStr(g)
End Sub
End Class
3.Module
主要都是全局变量的声明。
Module Module1
Public eff, c, e2, L1, B1, A12, S, L2, B2, A21 As Double
Public DB0, DL0, DA0, BD1, DL1, DA1 As Double
Public Bm, Am, Lm As Double
Public M1, N1 As Double
Public Nm, Mm, Vm As Double
Public p = 206264.80624709636
Public tm, itam As Double
Public db, dl, da As Double
End Module

1万+

被折叠的 条评论
为什么被折叠?



