代码之家  ›  专栏  ›  技术社区  ›  user_01

计算多个位置之间的全局距离

  •  -1
  • user_01  · 技术社区  · 6 年前

    我正在根据坐标计算两个全局位置之间的距离。当只使用两个位置时,我会得到结果:

    def global_distance(location1, location2):
        lat1, lon1 = location1
        lat2, lon2 = location2
        radius = 6371 # radius of the Earth
    
        dlat = math.radians(lat2-lat1)
        dlon = math.radians(lon2-lon1)
        a = math.sin(dlat/2) * math.sin(dlat/2) + math.cos(math.radians(lat1)) \
            * math.cos(math.radians(lat2)) * math.sin(dlon/2) * math.sin(dlon/2)
        c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
        d = radius * c
    
        return d
    
    lat1 = 55.32; lat2 = 54.276; long1 = -118.8634; long2 = -117.276
    
    
    print( global_distance((lat1, long1), (lat2, long2)))
    

    如果我想计算几个位置之间的距离呢?假设我有一个包含三个位置的CSV文件:

    Location   Lat1      Long1      
     A         55.322    -117.17
     B         57.316    -117.456
     C         54.275    -116.567
    

    我如何迭代这两列并生成(A,B)、(A,C)和(B,C)之间的距离?

    2 回复  |  直到 6 年前
        1
  •  2
  •   abarnert    6 年前

    假设您已将CSV读入某种序列(例如。, list(csv.reader(f)) ),您只需迭代所有位置组合。这正是我想要的 itertools.combinations 做:

    >>> locs = [('A', 55.322, -117.17), ('B', 57.316, -117.456), ('C', 54.275, 116.567)]
    >>> for (loc1, lat1, lon1), (loc2, lat2, lon2) in itertools.combinations(locs, 2):
    ...     print(loc1, loc2, global_distance((lat1, lon1), (lat2, lon2)))
    A B 222.42244003744995
    A C 122.66829007875741
    B C 342.67144769115316
    

    当您查看上面的链接文档时,请注意 combinations_with_replacement , permutations product ,这通常是相似但略有不同的问题的答案。

    这应该很容易适应一系列的口述,或一系列的口述 Location 实例等。另一方面,如果您有2D numpy数组或pandas数据帧之类的东西,您可能需要做一些不同的事情。(虽然从快速搜索来看,它看起来就像是在 itertools 结合 fromiter 即使你想用空间换取时间来播放你的视频,也不会比其他任何东西慢很多 global_distance 功能。)

        2
  •  1
  •   SpghttCd    6 年前

    我会通过熊猫从你的文件中导入数据:

    import pandas as pd
    df = pd.read_table(filename, sep='\s+', index_col=0)
    

    此外,您还可以导入itertools:

    import itertools as it
    

    有了它,你可以得到一个iterable的所有组合,比如数据帧的索引:

    for i in it.combinations(df.index, 2): print(i)
    ('A', 'B')
    ('A', 'C')
    ('B', 'C')
    

    这表明,你会得到你想要的组合。 现在对数据帧的数据执行同样的操作:

    for i in it.combinations(df.values, 2): print(global_distance(i[0], i[1]))
    222.4224400374507
    122.66829007875636
    342.671447691153
    

    如果您想在输出中包含位置名称,可以不使用 index_col=0 导入时,使A、B和C也是 df.values 你可以写:

    for i in it.combinations(df.values, 2): print(i[0][0], '-', i[1][0], global_distance(i[0][1:], i[1][1:]))
    A - B 222.4224400374507
    A - C 122.66829007875636
    B - C 342.671447691153