25 Февраль 2011

Расстояние между двумя городами

Базы данных |  Таги: , , , , , ,

Расстояние между двумя городами

На форме — кнопка.
Подключаемые компоненты — DAO 3.6
Нужна База данных Access в той же папке, что и программа. «Координаты.mdb» с таблицей Координаты:

Город Долгота_Градусов Долгота_Минут Долгота_Секунд Широта_Градусов Широта_Минут Широта_Секунд
Киев 30 30 0 50 27 0
Йокогама 139 38 0 35 26 0
Москва 37 37 0 55 45 0

Города должны находиться в одном четвертьшарии (например, в южном и восточном или северном и западном).

Private Sub Command1_Click()

Const Radius = 6371

Dim Gorod1 As String
Dim Gorod2 As String

Dim DB As Database
Dim rsGoroda As Recordset

Dim ShirotaAGrad As Double
Dim ShirotaAMin As Double
Dim ShirotaASec As Double
Dim ShirotaARad As Double

Dim ShirotaBGrad As Double
Dim ShirotaBMin As Double
Dim ShirotaBSec As Double
Dim ShirotaBRad As Double

Dim DolgotaAGrad As Double
Dim DolgotaAMin As Double
Dim DolgotaASec As Double
Dim DolgotaARad As Double

Dim DolgotaBGrad As Double
Dim DolgotaBMin As Double
Dim DolgotaBSec As Double
Dim DolgotaBRad As Double

Dim CosD As Double

    Gorod1 = "Йокогама"
    Gorod2 = "Киев"

    Set DB = DBEngine.OpenDatabase(App.Path & "\Координаты.mdb")

    Set rsGoroda = DB.OpenRecordset("Select * From [Координаты] Where [Город]=" & """" & Gorod1 & """")

        DolgotaAGrad = rsGoroda.Fields("Долгота_Градусов")
        DolgotaAMin = rsGoroda.Fields("Долгота_Минут")
        DolgotaASec = rsGoroda.Fields("Долгота_Секунд")

        ShirotaAGrad = rsGoroda.Fields("Широта_Градусов")
        ShirotaAMin = rsGoroda.Fields("Широта_Минут")
        ShirotaASec = rsGoroda.Fields("Широта_Секунд")

    Set rsGoroda = DB.OpenRecordset("Select * From [Координаты] Where [Город]=" & """" & Gorod2 & """")

        DolgotaBGrad = rsGoroda.Fields("Долгота_Градусов")
        DolgotaBMin = rsGoroda.Fields("Долгота_Минут")
        DolgotaBSec = rsGoroda.Fields("Долгота_Секунд")

        ShirotaBGrad = rsGoroda.Fields("Широта_Градусов")
        ShirotaBMin = rsGoroda.Fields("Широта_Минут")
        ShirotaBSec = rsGoroda.Fields("Широта_Секунд")

    rsGoroda.Close
    Set rsGoroda = Nothing

    DB.Close
    Set DB = Nothing

    ShirotaARad = GMS_To_Rad(ShirotaAGrad, ShirotaAMin, ShirotaASec)
    ShirotaBRad = GMS_To_Rad(ShirotaBGrad, ShirotaBMin, ShirotaBSec)
    DolgotaARad = GMS_To_Rad(DolgotaAGrad, DolgotaAMin, DolgotaASec)
    DolgotaBRad = GMS_To_Rad(DolgotaBGrad, DolgotaBMin, DolgotaBSec)

    CosD = Sin(ShirotaARad) * Sin(ShirotaBRad) + Cos(ShirotaARad) * Cos(ShirotaBRad) * Cos(DolgotaARad - DolgotaBRad)

    MsgBox Atn(Sqr(1 - CosD ^ 2) / CosD) * Radius

End Sub

Function GMS_To_Rad(G As Double, M As Double, S As Double) As Double
Const pi = 3.14
  GMS_To_Rad = (pi / 180) * (G + M / 60 + S / 3600)
End Function


Оставить комментарий

Я не робот.