python - 在数据集中查找第二个最近的点
问题描述
我有 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 。
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))
推荐阅读
- php - 表单输入值未在操作中传递
- jenkins - 即使元素存在,机器人框架也无法检测到元素的可能原因是什么?
- javascript - 如果不在数组中,则用于更新的 Firestore 规则
- python - Pandas - 如何在不使用循环的情况下为重复系列分配不同的类?
- pandas - 用熊猫重命名特定单元格下方的多个单元格
- c - 使用 pred 读取文件
- spring-boot - 无法在 springboot 中为 JMSListner @MockBean
- c# - web3 集成现有的 ERC20 合约
- javascript - 为什么 JavaScript 缩小器不使用它分配给“this”的变量
- python - 变分自动编码器的最佳输入图像尺寸