【问题标题】:Nearest latitude and longitude points in pythonpython中最近的经纬度点
【发布时间】:2021-11-16 11:26:01
【问题描述】:

我有列表 1 和列表 2 中的电台列表 如何从 List 2 中找到距 List 1 最近的车站?

list 1 and 2

列表 1

SS 无纬度经度 977 23.141747 53.796469 946 23.398398 55.422916 742 23.615732 53.717952 980 23.633077 55.567046 660 23.6504 54.4007

清单 2

SS 无纬度经度 962 23.657571 53.703683 745 23.671971 52.955976 743 23.766849 53.770344 978 23.847163 52.809653 748 23.942166 52.16236 744 23.955817 52.790424 760 23.984592 55.55764 945 24.030256 55.844842 894 24.03511 53.891547 856 24.741601 55.80063 893 24.04123 53.899958 387 24.059988 51.748138 675 24.061578 53.417912 664 24.063978 51.76195

我可以通过将它们映射到 PowerBI 来手动执行此操作,但我正在寻找一个可扩展的解决方案,并且 更喜欢 Python。

【问题讨论】:

    标签: python geolocation


    【解决方案1】:

    geopy 是你的朋友。它具有计算坐标对之间距离的功能。这是一种方法:

    from geopy import distance
    
    s = {
        977: (23.141747, 53.796469),
        946: (23.398398, 55.422916),
        # etc etc
    }
    
    d = {
        962: (23.657571, 53.703683),
        745: (23.671971, 52.955976),
        743: (23.766849, 53.770344),
        # etc etc
    }
    
    for (ss, a) in s.items():
        best = None
        dist = None
        for (dd, b) in d.items():
            km = distance.distance(a, b).km
            if dist is None or km < dist:
                best = dd
                dist = km
    
        print(f'{ss} is nearest {best}: {dist} km')
    

    如果我用你的示例数据运行它,我会得到:

    977 is nearest 962: 57.909274476145846 km
    946 is nearest 760: 66.3613771288571 km
    742 is nearest 962: 4.857141728990575 km
    980 is nearest 760: 38.94400553289674 km
    660 is nearest 743: 65.56437761273963 km
    

    如果您需要从列表 1 到列表 2 的距离,您可以尝试

    sorted([[ss, dd, distance.distance(a, b).km] for (ss, a) in s.items()
            for (dd, b) in d.items()])
    

    这给出了一个列表列表,按列表第 1 项排序:

    [[660, 387, 273.98088337893], 
     [660, 664, 272.6633222300461], 
     [660, 675, 109.98235440892797], 
     [660, 743, 65.56437761273963],
    
     # etc
    

    进一步排序或分组留给读者作为练习。

    【讨论】:

    • 谢谢!但是我怎样才能在附近找到多个车站?如果我希望列表 2 中前 2 或 3 个最近的车站列出 1?
    • 例如:977离962最近,:57.909274476145846 km 760,:57.909274476145846 km xyz:57.909274476145846 km a
    • 我已经编辑了我的答案给你一个开始。
    • 你是个野兽。非常感谢。
    【解决方案2】:

    这和上一个问题很相似
    Getting distance between two points based on latitude/longitude
    因此,它可以被声明为重复。
    无论如何,按照 Kurt Peek 的回答,您可以这样做:

    import geopy.distance
    
    def get_distnace(coords_1, coords_2):
        return geopy.distance.vincenty(coords_1, coords_2).km
    

    获取一个以“km”为单位返回距离的函数。然后,给出几个像你这样的列表,格式为

    list1 = [[stat_name_1, lat_1, lon_1], [stat_name_1, lat_1, lon_1], ... ]
    
    list2 = [[...], ... ]
    

    你可能会这样做:

    min_stat = get_distance(list1[0][1:], list2[0][1:])
    for stat_1 in list1:
        coord_1 = stat_1[1:]
        for stat_2 in list2:
            coord_2 = stat_2[1:]
            min_stat = min(min_stat, get_distance(coord_1, coord_2)
    

    把它当作一个草稿,一个想法,在任何应用程序之前进行调试和测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多