У меня есть уникальный идентификатор (столбец A) с соответствующим набором координат (DD-единицы, например 59, -110) для 500+ мест и я хотел бы написать макрос, который создает 2D-массив (500+ X 500+) и автоматически заполняет каждую ячейку в массиве расстоянием между всеми другими координатами в наборе данных.
Пример набора данных (начиная с A1):
ID Lat Long
A 59 -110
B 58 -105
C 62 -103
Надеюсь, я могу создать массив, который выглядит следующим образом:
A B C
A 0 X Y
B X 0 Z
C Y Z 0
Формула для расчета расстояниямежду двумя координатами:
=ACOS( SIN(lat1*PI()/180)*SIN(lat2*PI()/180) + COS(lat1*PI()/180)*COS(lat2*PI()/180)*COS(long2*PI()/180-long1*PI()/180) ) * 6371000
В дополнение к этому, если возможно, я хотел бы добавить строку в конец массива, которая дает самое низкое вычисленное расстояние, которое не равно нулю.
Это то, что у меня пока есть:
Const R2D As Double = (3.1459 / 180)
Const MagicNumber As Long = 637100
Private Function GetDistances(Lat1 As Double, Lat2 As Double, Long1 As Double, Long2 As Double) As Double
GetDistances = Acos(Sin(Lat1) * Sin(Lat2) * R2D ^ 2 + Cos(Lat1) * Cos(Lat2) * Cos(Long2) * R2D ^ 3 - Long1 * R2D) * MagicNumber
End Function
Sub MakeMatrix()
Dim Originals As Variant
Dim Distances As Variant
Dim Results As Double
Dim i As Long, j As Long, k As Long, l As Long
Dim Rws As Long
Const Lat As Long = 1
Const Lon As Long = 2
Const MinDistance = 0.01
Rws = Cells(Rows, Count, "A").End(xlUp).Row - 1
Originals = Application.Transpose(Range(Cells(2, "B"), Cells(Rws, "C"))).Value
ReDim Distances(1 To Rws1, 1 To Rws)
For i = LBound(Originals) To UBound(Originals)
For j = LBound(Originals) To UBound(Originals)
Results = GetDistance(Lat1:=Originals(i, Lat), Lat2:=Originals(j, Lat), Long1:=Originals(i, Lon), Long1:=Originals(j, Lon))
If Results > MinDistance Then Distances(i, j) = Results
Next j: Next i
Range("F1").Resize(Rws, Rws) = Distances
End Sub
Любая помощь с этим будет принята с благодарностью
Новое в стеке, так что если есть какая-либо дополнительная информация, пожалуйста, спросите
Заранее спасибо