我使用以下代码为单位范围生成fibonacci lattice, see page 4。我认为代码工作正常。接下来,我有一个点列表(由弧度的纬度和经度指定,就像生成的斐波纳契晶格点一样)。对于每个点,我想找到斐波纳契晶格上最近点的索引。即我有latitude
和longitude
,想要获得i
。我该怎么做?
我特别不想迭代格子中的所有点并找到距离最小的点,因为在实践中我生成的不仅仅是50
点如果可能O(n*m)
,我不希望运行时为O(m)
。
FWIW,在谈到距离时,我的意思是haversine distance。
#!/usr/bin/env python2
import math
import sys
n = 50
phi = (math.sqrt(5.0) + 1.0) / 2.0
phi_inv = phi - 1.0
ga = 2.0 * phi_inv * math.pi
for i in xrange(-n, n + 1):
longitude = ga * i
longitude = (longitude % phi) - phi if longitude < 0 else longitude % phi
latitude = math.asin(2.0 * float(i) / (2.0 * n + 1.0))
print("{}-th point: ".format(i + n + 1))
print("\tLongitude is {}".format(longitude))
print("\tLatitude is {}".format(latitude))
// Given latitude and longitude of point A, determine index i of point which is closest to A
// ???
答案 0 :(得分:0)
您可能正在寻找的是空间索引:HERE。由于您只关心最近邻搜索,因此您可能希望使用相对简单的内容,例如https://en.wikipedia.org/wiki/Spatial_database#Spatial_index。
请注意,空间索引通常考虑平面上的点而不是球体。为了使其适应您的情况,您可能希望将球体分成几个可以用矩形近似的区域。然后,您可以根据矩形近似找到几个最近的邻居,并计算它们的实际半径距离以识别真正的最近邻居。