基本上,我的实验程序试图在给定时间找到落在有效点半径(例如50km)内的点数。我的数据是在三个独立的数组中构建的(但我可以根据需要进行重组):
1_LAT,1_LON,1_TIM
其中1_LAT,1_LON,1_TIM分别包含大约250个与纬度,经度(十进制度数)和时间对应的值。
我有20套这些阵列(即1_LAT,1_LON,1_TIM ...... 20_LAT,20_LON,20_TIM)。
以下是我想要完成的事情:
1)计算出落在每组特定半径内的纬度/经度集的数量。例如,有多少点落在1_LAT半径的50km范围内,在1_TIM的有效时间内从其他19组点落入1_LON。然后,我想迭代每个有效时间,找出每个特定点和有效时间内有效半径内的点数。
我附上了一张图片,以帮助直观地描述。
黑色方块表示LAT_1 / LON_1阵列中的所有点。 蓝色方块表示LAT_n / LAT_n阵列中的所有点。
我想计算每组lat / lon数组在每个有效时间内每个半径的点数。最终显示将是地理底图图像上的每个网格点的denisty(即,计数数/ 20)的总和光栅或网格。
我有一种感觉,KDEtree可能是实现这一目标的最佳方式,但我很少/没有经验。任何想法或建议将不胜感激。
答案 0 :(得分:2)
您可以执行以下操作...首先,将每个组的(x, y)
坐标分组到一个points_x
数组中:
points_1 = np.column_stack((LAT_1, LON_1))
...
points_n = np.column_stack((LAT_n, LON_n))
将它们存储在数组列表中可能是个好主意:
points = [point_1, points_2, ..., points_n]
现在,从每组点中创建一个kdTree:
import scipy.spatial as spsp
kdtrees = [spsp.cKdTree(p) for p in point]
你准备好了。如果您现在运行以下代码:
r = whatever_your_threshold_value_is
points_within_r = np.zeros((len(kdtrees), len(kdtrees)), dtype=np.int)
for j in xrange(len(kdtrees)):
for k in xrange(j+1, len(kdtrees)):
points_within_r[j, k] = kdtrees[j].count_neighbors(kdtrees[k], r, 2)
points_within_r = points_within_r + points_within_r.T
您现在应该发现points_within_r[j, k]
包含points_j
中r
中points_k
点内半径{{1}}内的点数。
请记住,这里的距离是坐标的欧氏距离,而忽略了它们测量的是球面角度的事实。