如何查找最近的坐标点

有一大堆点,知道这些点的x,y坐标(目前不知道用什么储存比较好)
要求,输入一个点,然后在这一大堆点里,查找离输入点最近的点的坐标(使用python)
请问有什么好方法或者算法

使用k维树:


 from scipy import spatial
 airports = [(10,10),(20,20),(30,30),(40,40)]# <--点集合
tree = spatial.KDTree(airports)
 tree.query([(21,21)])# <--要查找的点
# <--输出结果(距离,airports的数组索引)(array([ 1.41421356]), array([1]))

Numpy有一个有用的函数:norm。

import numpy as np
A = [(26, 63), (25, 63), (24, 63), (23, 63), (22, 63), (21, 63), (20, 63), (22, 62), (27, 63)]# <--点集合
A = np.array(A)
leftbottom = np.array((0,238))# <--要查找的点
distances = np.linalg.norm(A-leftbottom, axis=1)
min_index = np.argmin(distances)
print(f"最近的点是{A[min_index]}, 距离为{distances[min_index]}")# <--输出结果

这个就是KNN算法的思路,就是把点的坐标投影到欧式空间,distance=math.sqrt((x1-x2)**2+(y1-y2)**2),以此类推,(x1,y1)是你的已知坐标,循环选择选择最短的distance为距离最近的点,实现的时候推荐你用numpy库来弄,速度快,存储点的话txt,csv,excel都可以,我推荐csv,因为csv存储的时候刚好可以用逗号隔开,每行就是一个坐标点

以这点为圆心,然后半径依次累加,找这个园内是否覆盖有其它坐标点,遍历这个园内的所有坐标,计算欧式距离(或者城市距离,自己选择)最近的点。就是最近邻算法。

可通过欧几里得距离进行计算,参考:

import numpy as np
C = [[1,1], [10,10]]
X = [[1,2], [1,3], [2,1], [10,11], [10,12], [11,11], [12,11], [9,11]]
def F(C,X):
    Carr = np.array(C)
    Xarr = np.array(X)
    distances = [np.sum( (Xarr - Carr[i])**2, axis=1) for i in range(len(C))]
    closests = np.argmin( np.array(distances), axis=0 )
    return list( np.bincount(closests) )
print(F(C,X))

补充:
量小的话用这种方法较为适宜,如果量太大了的话,可以使用k-means方法将点先进行聚类,比如说1000个点,分成了5簇,在计算的时候先计算和这5簇最近的那一簇,看目标点落在哪个簇里面,再在这个簇里面进行计算,就可以少计算很多次
保存的话,量太大建议用numpy库支持的npy格式保存,读取速度很快,占用空间小
直接用np.save(array) ,np.load(FILE_NAME) 即可

如果有用的话请采纳呀

我是把点放到数组里,如果在文件里可以把点读进来存到数组:

import numpy as np
points = np.array([[1,2],[3,4],[5,6],[7,8]])
coor = input("请输入点的坐标(格式:x,y):")
point = np.array(list(map(int, coor.split(","))))
dists = [np.linalg.norm(point-p) for p in points]
print(f'距离最近的坐标点是:{points[dists.index(min(dists))]}')

kd-tree (K-d树)就是专门干这个的,查找时间为O(log n)。github上可以找到很多python实现,比如这个https://github.com/gisalgs/indexing/blob/master/kdtree1.py (GIS Algorithms 书里的代码)。

输入
代表我所处位置的坐标对(x,y)。
一组坐标对[(a1,b1), (a2,b2)...],其中每个坐标对表示一个机场。
所需输出
机场坐标对集合中的坐标对(a,b),表示距离点(x,y)最近的机场。
效率低下的解决方案
这是我解决这个问题的低效尝试。很明显,在机场的长度上是线性的。
shortest_distance = None
shortest_distance_coordinates = None

point = (50.776435, -0.146834)

for airport in airports:
distance = compute_distance(point, airport)
if distance < shortest_distance or shortest_distance is None:
shortest_distance = distance
shortest_distance_coordinates = airport

既然是二维的话就用欧式距离来度量新输入点与其他所有点的距离,存储的话txt和excel都可以,读取数据之后放到numpy里面,计算每个点与当前点的距离,然后找到最小距离所对应的点。