Найти расстояние между разными координатами - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть данные о местоположении (широта и долгота) из 1000 местоположений, и мне нужно вычислить расстояние между каждой из них, взятых двумя комбинациями одновременно.

Пример:

Давайте просто скажем У меня есть четыре данных о местоположении (данные о широте и долготе), и я хочу вычислить расстояние между ними

    Location      Latitude    Longitude

 1. New York(L1)  40.7128° N  74.0060° W
 2. Paris(L2)     48.8566° N   2.3522° E
 3. London(L3)    51.5074° N   0.1278° W
 4. Moscow(L4)    55.7558° N  37.6173° E

Необходимо рассчитать расстояние между возможными комбинациями, т.е. расстояние между L1&L2, L1&L3, L1&L4 , L2&L3, L2&L4 и L3&L4

Формула Excel, которую я использую для вычисления расстояния:

=ACOS(COS(RADIANS(90-Lat1)) *COS(RADIANS(90-Lat2)) +SIN(RADIANS(90-Lat1)) *SIN(RADIANS(90-Lat2)) *COS(RADIANS(Long1-Long2))) *6371

Как рассчитать ее для большого набора данных, скажем, 100 или 1000 мест?

Ответы [ 2 ]

3 голосов
/ 23 апреля 2020

Кроме того, вы можете создать функцию VBA и затем l oop через вашу таблицу.

Добавить этот код в модуль в редакторе VBA:

Public Function DistBetweenCoord(Lat1 As Double, Long1 As Double, Lat2 As Double, Long2 As Double)
    'Cell Formula
    'ACOS(COS(RADIANS(90-Lat1)) *COS(RADIANS(90-Lat2)) +SIN(RADIANS(90-Lat1)) *SIN(RADIANS(90-Lat2)) *COS(RADIANS(Long1-Long2))) *6371

    With WorksheetFunction
        A = Cos(.Radians(90 - Lat1))
        B = Cos(.Radians(90 - Lat2))
        C = Sin(.Radians(90 - Lat1))
        D = Sin(.Radians(90 - Lat2))
        E = Cos(.Radians(Long1 - Long2))

        DistBetweenCoord = .Acos(A * B + C * D * E) * 6371
    End With
End Function

Теперь вы можете получить доступ к этому через код или в ячейке. Вот пример внутри ячейки:

=DistBetweenCoord(C1,D1,C2,D2)

Вот как l oop через все возможные комбинации в другом Sub. Вывод находится в непосредственном окне.

Sub CalcAllDistances()
    With Worksheets("Sheet1")
        For i = 1 To 4
            For j = i To 4
                If i <> j Then
                    Debug.Print .Cells(i, 2) & " to " & .Cells(j, 2) & ": " & DistBetweenCoord(.Cells(i, 3), .Cells(i, 4), .Cells(j, 3), .Cells(j, 4))
                End If
            Next j
        Next i
    End With
End Sub

enter image description here


EDIT - Чтобы изменить вывод на Sheet2, попробуйте следующее:

Sub CalcAllDistances()
    Dim wks_Output As Worksheet
    Set wks_Output = Worksheets("Sheet2")

    Dim OutputRow As Long: OutputRow = 1

    With Worksheets("Sheet1")
        For i = 1 To 4
            For j = i To 4
                If i <> j Then
                    wks_Output.Cells(OutputRow, 1).Value = .Cells(i, 2) & " to " & .Cells(j, 2)
                    wks_Output.Cells(OutputRow, 2).Value = DistBetweenCoord(.Cells(i, 3), .Cells(i, 4), .Cells(j, 3), .Cells(j, 4))
                    OutputRow = OutputRow + 1
                End If
            Next j
        Next i
    End With
End Sub

enter image description here

2 голосов
/ 23 апреля 2020

Я бы использовал матрицу. Создайте лист (например, «GeocodeList» или что-то в этом роде) для геокодов, например, ваш город в вопросе. Затем создайте лист (например, «Расстояния») для матрицы, где метки столбцов и строк представляют собой названия городов. Затем вы можете настроить параметры своей формулы Excel, используя V.LOOKUP, которые ищут точные коды из GeocodeList.

Формула будет выглядеть так (X - номер строки, Y - буква столбца.):

=ACOS(COS(RADIANS(90-VLOOKUP($A(X); GEOCODETABLE, LATCOLINDEX, 0)))
*COS(RADIANS(90-VLOOKUP((Y)$1; GEOCODETABLE; LATCOLINDEX, 0)))
+SIN(RADIANS(90-VLOOKUP($A(X); GEOCODETABLE, LATCOLINDEX, 0)))
*SIN(RADIANS(90-VLOOKUP((Y)$1; GEOCODETABLE; LATCOLINDEX, 0)))
*COS(RADIANS(VLOOKUP($A(X); GEOCODETABLE, LATCOLINDEX, 0)-VLOOKUP((Y)$1; GEOCODETABLE; LONCOLINDEX, 0))))
*6371

Таким образом, VLOOKUP автоматически выбирает ваши параметры, и вы можете расширить формулу для всей матрицы.

...