Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 找出不同坐标之间的距离_Excel_Vba_Excel Formula_Geocoding - Fatal编程技术网

Excel 找出不同坐标之间的距离

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

我有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个位置),我如何计算它?

我会使用矩阵。 创建一个类似“地理编码列表”的表格,或者一些地理编码的表格,比如问题中的城市拉特隆。然后为矩阵创建一个类似表格的“距离”,其中列和行标签是城市名称。然后,您可以使用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”表示必须找到与查找值完全匹配的值