Excel 找出不同坐标之间的距离
我有1000个位置的纬度和经度的位置数据,需要计算每个位置之间的距离,每次两个组合 例如: 假设我有四个位置数据纬度和经度数据,并想计算它们之间的距离Excel 找出不同坐标之间的距离,excel,vba,excel-formula,geocoding,Excel,Vba,Excel Formula,Geocoding,我有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
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个位置),我如何计算它?我会使用矩阵。
创建一个类似“地理编码列表”的表格,或者一些地理编码的表格,比如问题中的城市拉特隆。然后为矩阵创建一个类似表格的“距离”,其中列和行标签是城市名称。然后,您可以使用V.LOOKUPs参数化excel公式,V.LOOKUPs可以从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会自动获取您的参数,您可以扩展整个矩阵的公式。我会使用矩阵。
创建一个类似“地理编码列表”的表格,或者一些地理编码的表格,比如问题中的城市拉特隆。然后为矩阵创建一个类似表格的“距离”,其中列和行标签是城市名称。然后,您可以使用V.LOOKUPs参数化excel公式,V.LOOKUPs可以从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会自动获取您的参数,您可以扩展整个矩阵的公式。或者,您可以创建一个VBA函数,然后在表中循环 将此代码添加到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)
下面是如何循环另一个子系统中所有可能的组合。输出在即时窗口中
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
编辑-要将输出更改为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
或者,您可以创建VBA函数,然后在表中循环 将此代码添加到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)
下面是如何循环另一个子系统中所有可能的组合。输出在即时窗口中
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
编辑-要将输出更改为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
在单元格中应用=distBetweenCordc1、D1、C2、D2公式时出现无效名称错误,这可能意味着它找不到函数。是否将函数添加到模块或工作表代码中?如果位于工作表代码中,它将不起作用。是的,现在公式在单元格中起作用。您能否详细说明子计算距离部分以及如何获得即时窗口,当在VBA编辑器ALT+F11中时,您可以通过查看->立即窗口或CTRL+GThanks显示立即窗口,效果很好,但仅限于四个位置条目。如何将其扩展到100个或1000个条目?应用=distbetweenCordc1、D1、C2时出现无效名称错误,单元格中的D2公式,这可能意味着它找不到函数。是否将函数添加到模块或工作表代码中?如果位于工作表代码中,它将不起作用。是的,现在公式在单元格中起作用。您能否详细说明子计算距离部分以及如何获得即时窗口,在VBA编辑器ALT+F11中,您可以通过查看->即时窗口或CTRL+GThanks显示即时窗口,效果很好,但仅限于四个位置条目。如何将其扩展到100或1000个条目?创建了两张图纸sheet1:GeocodeList-其中包含城市名称作为Column 1纬度数据作为Column 2经度数据作为Column 3sheet2:距离-包含A2:A5和B1:E1中的城市名称不理解VLOOKUP公式,可以详细说明吗?VLOOKUP返回查找表第X列中的值,其中第一列的值等于您的查找值。所以当你的vlookup看起来像vlookup$A2;'地理编码列表'$A:$C;2.0公式将返回工作表地理编码列表第2列B列中的值,其中地理编码列表A列中的第一列等于距离工作表中的查找值A2,因此如果“距离”中的A2为“纽约”,而“地理编码列表”中的A3为“纽约”,您将从'GeocodeList'B3中获得纽约的纬度注意:vlookup公式末尾的'0'意味着它必须找到与查找值完全匹配的值创建了两张表sheet1:GeocodeList-其中包含城市名称作为Column 1纬度数据作为Column 2经度数据作为Column 3 sheet2:Distances-其中包含来自A2:A5和B1:E1的城市名称我不懂VLOOKUP公式,你能详细说明一下吗?VLOOKUP返回查找表第X列中的值,其中第一列的值等于您的查找值。所以当你的vlookup看起来像vlookup$A2;'地理编码列表'$A:$C;2.0该公式将返回s第2列B列中的tha值
GeocodeList,其中GeocodeList col A中的第一列等于距离表中的查找值A2,因此,如果“距离”中的A2为“纽约”,而“GeocodeList”A3中的A2为“纽约”,则您将从“GeocodeList”B3中获得纽约的纬度。注:vlookup公式末尾的“0”表示必须找到与查找值完全匹配的值