⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 frmdist.frm

📁 根据地球上两点经纬度(以度分秒为单位)
💻 FRM
字号:
VERSION 5.00
Begin VB.Form frmDist 
   Caption         =   "大地线长度"
   ClientHeight    =   3120
   ClientLeft      =   60
   ClientTop       =   450
   ClientWidth     =   4155
   LinkTopic       =   "Form1"
   ScaleHeight     =   3120
   ScaleWidth      =   4155
   StartUpPosition =   3  '窗口缺省
   Begin VB.TextBox txtDist 
      Height          =   375
      Left            =   1920
      TabIndex        =   5
      Top             =   1560
      Width           =   1935
   End
   Begin VB.CommandButton cmdCal 
      Caption         =   "计算"
      Height          =   375
      Left            =   120
      TabIndex        =   4
      Top             =   1560
      Width           =   1215
   End
   Begin VB.TextBox txtB 
      Height          =   375
      Index           =   1
      Left            =   2640
      TabIndex        =   3
      Top             =   960
      Width           =   1215
   End
   Begin VB.TextBox txtB 
      Height          =   375
      Index           =   0
      Left            =   2640
      TabIndex        =   2
      Top             =   360
      Width           =   1215
   End
   Begin VB.TextBox txtL 
      Height          =   375
      Index           =   1
      Left            =   480
      TabIndex        =   1
      Top             =   960
      Width           =   1215
   End
   Begin VB.TextBox txtL 
      Height          =   375
      Index           =   0
      Left            =   480
      TabIndex        =   0
      Top             =   360
      Width           =   1215
   End
   Begin VB.Label Label7 
      Caption         =   "有任何问题请联系:http://www.sciencenet.cn/blog/zjwang.htm"
      Height          =   375
      Left            =   120
      TabIndex        =   12
      Top             =   2520
      Width           =   3855
   End
   Begin VB.Label Label6 
      Caption         =   "说明:程序中角度一率采用度、分、秒六二进制表示。"
      Height          =   495
      Left            =   120
      TabIndex        =   11
      Top             =   2040
      Width           =   3855
   End
   Begin VB.Label Label5 
      Caption         =   "S"
      Height          =   375
      Left            =   1560
      TabIndex        =   10
      Top             =   1680
      Width           =   255
   End
   Begin VB.Label Label4 
      Caption         =   "B1"
      Height          =   255
      Left            =   2280
      TabIndex        =   9
      Top             =   480
      Width           =   255
   End
   Begin VB.Label Label3 
      Caption         =   "B2"
      Height          =   255
      Left            =   2280
      TabIndex        =   8
      Top             =   960
      Width           =   255
   End
   Begin VB.Label Label2 
      Caption         =   "L2"
      Height          =   255
      Left            =   120
      TabIndex        =   7
      Top             =   960
      Width           =   255
   End
   Begin VB.Label Label1 
      Caption         =   "L1"
      Height          =   255
      Left            =   120
      TabIndex        =   6
      Top             =   480
      Width           =   255
   End
End
Attribute VB_Name = "frmDist"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Sub cmdCal_Click()
    txtDist = GetDistance(Val(txtL(0)), Val(txtB(0)), Val(txtL(1)), Val(txtB(1)))
End Sub

'*******************************************************************************
'
'       函数名:GetDistance
'       描  述:根据地球表面两点经纬度获得两点之间大地线长度
'       信  息:汪自军  吉林大学  2006.3
'       参  数:
'         Double dL1 第一个点的经度
'         Double dB1 第一个点的纬度
'         Double dL1 第一个点的经度
'         Double dB1 第一个点的纬度
'       返回值:两点大地线长度
'
'*********************************************************************************
Function DecTranToRad(ByVal dSextileAngle As Double) As Double
        
    DecTranToRad = dSextileAngle * 3.14159265358974 / 180
    
End Function
Public Function ArcCos(x As Double) As Double
    
        ArcCos = Atn(-x / Sqr((-x * x + 1) + 0.000000000001)) + 2 * Atn(1)

    End Function
 Function ArcSin(x As Double) As Double

        ArcSin = Atn(x / Sqr(-x * x + 1))

    End Function

 

Function GetDistance(ByVal dL1 As Double, ByVal dB1 As Double, ByVal dL2 As Double, ByVal dB2 As Double) As Double

    dL1 = DecTranToRad(dL1) '六十进制角度转化为弧度制   当经度相同时不可用此程序
    dB1 = DecTranToRad(dB1)
    dL2 = DecTranToRad(dL2)
    dB2 = DecTranToRad(dB2)
 Dim u1 As Double
 Dim u2 As Double
 Dim l As Double
 Dim e
 e = 0.006693421622966
 Dim W1
 W1 = Sqr(1 - e * Sin(dB1) * Sin(dB1))
 Dim W2
 W2 = Sqr(1 - e * Sin(dB2) * Sin(dB2))
 
 Dim f1 As Double
 f1 = Cos(dB1) / W1: u1 = ArcCos(f1)
 Dim f2 As Double
 f2 = Cos(dB2) / W2: u2 = ArcCos(f2)
 l = dL2 - dL1
 Dim a1
 a1 = Sin(u1) * Sin(u2)
 Dim a2
 a2 = Cos(u1) * Cos(u2)
 Dim b1
 b1 = Cos(u1) * Sin(u2)
 Dim b2
 b2 = Sin(u1) * Cos(u2)
 Dim x
 Dim k
 k = l + x
 Dim y
 Dim p
 Dim q
 Dim A3
 Dim s
 
If dL1 = dL2 And dB1 <> dB2 Then
    s = Abs(111134.861 * dB1 * 180 / 3.141592654 - 32005.78 * Sin(dB1) * Cos(dB1) - 133.929 * Sin(dB1) * Sin(dB1) * Sin(dB1) * Cos(dB1) - 0.697 * Sin(dB1) * Sin(dB1) * Sin(dB1) * Sin(dB1) * Sin(dB1) * Cos(dB1) - 111134.861 * dB2 * 180 / 3.141592654 + 32005.78 * Sin(dB2) * Cos(dB2) + 133.929 * Sin(dB2) * Sin(dB2) * Sin(dB2) * Cos(dB2) + 0.697 * Sin(dB2) * Sin(dB2) * Sin(dB2) * Sin(dB2) * Sin(dB2) * Cos(dB2))
ElseIf dB1 = dB2 And dL1 <> dL2 Then
    s = 6378245 * Cos(dB1) * Abs(dL1 - dL2) / Sqr(1 - e * Sin(dB1) * Sin(dB1))
ElseIf dL1 = dL2 And dB1 = dB2 Then
    s = 0
Else
    x = 0
    p = Cos(u2) * Sin(k)
    q = b1 - b2 * Cos(k)
    A3 = Atn(p / q)
 If p >= 0 And q > 0 Then
     A3 = Abs(A3)
    ElseIf p >= 0 And q < 0 Then
      A3 = 3.141592654 - Abs(A3)
    ElseIf p < 0 And q < 0 Then
     A3 = 3.141592654 + Abs(A3)
    Else
     A3 = 2 * 3.141592654 - Abs(A3)
End If

Dim L1: L1 = p * Sin(A3) + q * Cos(A3)
Dim L2: L2 = a1 + a2 * Cos(k)
Dim g: g = Atn(L1 / L2)
If Cos(g) >= 0 Then
    g = Abs(g)
   Else
      g = 3.1415926 - Abs(g)
End If
 Dim A0
 Dim f3 As Double: f3 = Cos(u1) * Sin(A3): A0 = ArcSin(f3)
 Dim m: m = 2 * a1 - Cos(A0) * Cos(A0) * Cos(g)
 Dim a: a = (33523299 - (28189 - 70 * Cos(A0) * Cos(A0)) * Cos(A0) * Cos(A0)) * 0.0000000001
 Dim b: b = (28189 - 94 * Cos(A0) * Cos(A0)) * 0.0000000001
 y = (a * g - b * m * Sin(g)) * Sin(A0)
 
  While Abs(x - y) > 10 ^ -8
        x = y
        k = l + x
         p = Cos(u2) * Sin(k)
        q = b1 - b2 * Cos(k)
        A3 = Atn(p / q)
        If p >= 0 And q >= 0 Then
           A3 = Abs(A3)
        ElseIf p >= 0 And q <= 0 Then
           A3 = 3.1415926 - Abs(A3)
        ElseIf p < 0 And q < 0 Then
           A3 = 3.1415926 + Abs(A3)
        Else
           A3 = 2 * 3.1415926 - Abs(A3)
        End If
        L1 = p * Sin(A3) + q * Cos(A3)
        L2 = a1 + a2 * Cos(k)
        g = Atn(L1 / L2)
       If Cos(g) >= 0 Then
           g = Abs(g)
       Else
             g = 3.1415926 - Abs(g)
       End If
       f3 = Cos(u1) * Sin(A3): A0 = ArcSin(f3)
        m = 2 * a1 - Cos(A0) * Cos(A0) * Cos(g)
        a = (33523299 - (28189 - 70 * Cos(A0) * Cos(A0)) * Cos(A0) * Cos(A0)) * 0.0000000001
        b = (28189 - 94 * Cos(A0) * Cos(A0)) * 0.0000000001
        y = (a * g - b * m * Sin(g)) * Sin(A0)
    Wend
 x = y
 
 Dim T: T = 6356863.02 + (10708.949 - 13.474 * Cos(A0) * Cos(A0)) * Cos(A0) * Cos(A0)
 Dim H: H = 10708.938 - 17.956 * Cos(A0) * Cos(A0)
 Dim C: C = 4.487
 Dim X2: X2 = (Cos(A0) * Cos(A0) * Cos(A0) * Cos(A0) - 2 * m * m) * Cos(g)
 s = T * g + (H * m + C * X2) * Sin(g)
End If
GetDistance = s
End Function

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -