我正在处理有关消防栓位置的ID,X和Y数据的列表。我正在尝试为列表中的每个消防栓找到三个最接近的消防栓。
a = [[ID,X,Y],[ID,X,Y]]
我尝试使用for循环实现此功能,但是遇到麻烦,因为在遍历点列表时无法保持原始点数据相同。
是否有一种海峡前移的方式来计算从一个点到其他每个点的距离,并针对列表中的每个点进行迭代?我对python很陌生,还没有看到有关如何在线执行此操作的任何信息。
任何帮助将不胜感激。
答案 0 :(得分:1)
您在这里。假设您有一个格式为const cache = require('./cache');
module.exports = {
"invoke":function(){
console.log("Module A: ",cache.get('a'));
}
}
的输入列表。
遍历每个消防栓时,您可以简单地遍历每个消防栓并计算它们之间的最小距离。您只需要一个变量来存储每个消防栓的最小距离和最接近的消防栓的ID。
[[ID, X, Y],[ID, X, Y]]
由于距离函数不是很复杂,我将其重写,因此可以在scipy或numpy库中使用其他函数来获取距离。
希望这会有所帮助;)
答案 1 :(得分:1)
如果您有地理位置信息,我们可以执行简单的距离计算(https://en.m.wikipedia.org/wiki/Haversine_formula)来获取两个位置之间的千米距离。此代码并不意味着有效。如果这是您想要的,我们可以使用numpy加快速度:
import math
def distance(lat,lon, lat2,lon2):
R = 6372.8 # Earth radius in kilometers
# change lat and lon to radians to find diff
rlat = math.radians(lat)
rlat2 = math.radians(lat2)
rlon = math.radians(lon)
rlon2 = math.radians(lon2)
dlat = math.radians(lat2 - lat)
dlon = math.radians(lon2 - lon)
m = math.sin(dlat/2)**2 + \
math.cos(rlat)*math.cos(rlat2)*math.sin(dlon/2)**2
return 2 * R * math.atan2(math.sqrt(m),
math.sqrt(1 - m))
a = [['ID1', 52.5170365, 13.3888599],
['ID2', 54.5890365, 12.5865499],
['ID3', 50.5170365, 10.3888599],
]
b = []
for id, lat, lon in a:
for id2, lat2, lon2 in a:
if id != id2:
d = distance(lat,lon,lat2,lon2)
b.append([id,id2,d])
print(b)
答案 2 :(得分:1)
您不必计算所有点到所有其他点的所有距离即可获得所有点的三个最近邻居。
由于kd-tree search的O(log n)复杂度而不是蛮力方法(计算所有距离)的O(n ** 2)时间复杂度,因此效率更高。
示例
import numpy as np
from scipy import spatial
#Create some coordinates and indices
#It is assumed that the coordinates are unique (only one entry per hydrant)
Coords=np.random.rand(1000*2).reshape(1000,2)
Coords*=100
Indices=np.arange(1000) #Indices
def get_indices_of_nearest_neighbours(Coords,Indices):
tree=spatial.cKDTree(Coords)
#k=4 because the first entry is the nearest neighbour
# of a point with itself
res=tree.query(Coords, k=4)[1][:,1:]
return Indices[res]