首页 > 解决方案 > 在数据集中查找第二个最近的点

问题描述

我有 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

标签: pythondistancelatitude-longitude

解决方案


实际上,您可以尝试将 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))

推荐阅读