Python求和地理半径内的lat / lon点和网格的总和

时间:2013-07-30 19:53:47

标签: python numpy scipy matplotlib-basemap geopy

基本上,我的实验程序试图在给定时间找到落在有效点半径(例如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。然后,我想迭代每个有效时间,找出每个特定点和有效时间内有效半径内的点数。

我附上了一张图片,以帮助直观地描述。 sampleimage

黑色方块表示LAT_1 / LON_1阵列中的所有点。 蓝色方块表示LAT_n / LAT_n阵列中的所有点。

我想计算每组lat / lon数组在每个有效时间内每个半径的点数。最终显示将是地理底图图像上的每个网格点的denisty(即,计数数/ 20)的总和光栅或网格。

我有一种感觉,KDEtree可能是实现这一目标的最佳方式,但我很少/没有经验。任何想法或建议将不胜感激。

1 个答案:

答案 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_jrpoints_k点内半径{{1}}内的点数。

请记住,这里的距离是坐标的欧氏距离,而忽略了它们测量的是球面角度的事实。