【问题标题】:Find the second nearest point in a dataset在数据集中查找第二个最近的点
【发布时间】:2018-11-19 02:29:40
【问题描述】:

我有 2 组纬度和经度。

A = [{'lat' :40.2877, 'lon' : -94.7913}, {'lat' :40.7171, 'lon' : -73.9664}, {'lat' :32.7052, 'lon' : -117.1897}, {'lat' :33.2388, 'lon' : -115.5045}, .... ]
B = [{'lat' :47.7351, 'lon' : -117.3705}, {'lat' :41.6422, 'lon' : -71.1706}]

我需要找到B 的最近点、第二近点和第三近点。 为了找到最近的,我使用了:

from math import cos, asin, sqrt
def distance(lat1, lon1, lat2, lon2):
    p = 0.017453292519943295
    a = 0.5 - cos((lat2-lat1)*p)/2 + cos(lat1*p)*cos(lat2*p) * (1-cos((lon2-lon1)*p)) / 2
    return 12742 * asin(sqrt(a))

def closest(data, B):
    return min(data, key=lambda p:distance(B['lat'],B['lon'],p['lat'],p['lon']))

for item in B:
    print(closest(A, item))

如何在B 中找到每个项目的第二近点和第三近点?

【问题讨论】:

  • 不使用min,而是使用sorted 和相同的lambda 键。这应该为您提供A 中每个点的距离分数,对于B 中的每个点。

标签: python distance latitude-longitude


【解决方案1】:

其实你可以试试把 min 换成 sorted

def second_nearst(data, B):
    return sorted(
        data, key=lambda p: distance(B['lat'], B['lon'], p['lat'], p['lon']))[1]


for item in B:
    print(second_nearst(A, B))

def third_nearst(data, B):
    return sorted(
        data, key=lambda p: distance(B['lat'], B['lon'], p['lat'], p['lon']))[2]

for item in B:
    print(third_nearst(A, B))

【讨论】:

    【解决方案2】:

    您可以这样做,使用带有sorted() 而不是min() 的键功能:

    from math import cos, asin, sqrt
    from pprint import pformat
    from textwrap import indent
    
    
    A = [{'lat': 40.2877, 'lon': -94.7913},
         {'lat': 40.7171, 'lon': -73.9664},
         {'lat': 32.7052, 'lon': -117.1897},
         {'lat': 33.2388, 'lon': -115.5045}]
    
    B = [{'lat' :47.7351, 'lon' : -117.3705},
         {'lat' :41.6422, 'lon' : -71.1706}]
    
    def distance(lat1, lon1, lat2, lon2):
        p = 0.017453292519943295  # Pi / 180
        a = 0.5 - cos((lat2-lat1)*p)/2 + cos(lat1*p)*cos(lat2*p) * (1-cos((lon2-lon1)*p)) / 2
        return 12742 * asin(sqrt(a))
    
    def nearest(N, data, pt2):
        """ Return the nearest N points in data to pt2. """
        return sorted(data, key=
            lambda pt1: distance(pt2['lat'], pt2['lon'], pt1['lat'], pt1['lon']))[:N]
    
    for item in B:
        print(item, '->')
        print(indent(pformat(nearest(3, A, item)), '  '))
    

    输出:

    {'lat': 47.7351, 'lon': -117.3705} ->
      [{'lat': 33.2388, 'lon': -115.5045},
       {'lat': 32.7052, 'lon': -117.1897},
       {'lat': 40.2877, 'lon': -94.7913}]
    {'lat': 41.6422, 'lon': -71.1706} ->
      [{'lat': 40.7171, 'lon': -73.9664},
       {'lat': 40.2877, 'lon': -94.7913},
       {'lat': 33.2388, 'lon': -115.5045}]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-07
      相关资源
      最近更新 更多