Python求和地理半径内的lat/lon点并求和到栅格

Python求和地理半径内的lat/lon点并求和到栅格,python,numpy,scipy,matplotlib-basemap,geopy,Python,Numpy,Scipy,Matplotlib Basemap,Geopy,基本上,我的实验程序是试图找出在给定时间内有效点半径(例如50公里)内的点数。我的数据在三个单独的数组中结构化(但如果需要,我可以进行重组),例如: 一个纬度,一个纬度,一个时间 其中,1_LAT、1_LON、1_TIM都包含大约250个值,分别对应于纬度、经度(十进制度数)和时间 我有20组这样的阵列(即,1_-LAT、1_-LON、1_-TIM…20_-LAT、20_-LON、20_-TIM) 以下是我想要实现的目标: 1) 计算出每一组特定半径范围内的lat/lon组的数量。例如,在有效时

基本上,我的实验程序是试图找出在给定时间内有效点半径(例如50公里)内的点数。我的数据在三个单独的数组中结构化(但如果需要,我可以进行重组),例如:

一个纬度,一个纬度,一个时间

其中,1_LAT、1_LON、1_TIM都包含大约250个值,分别对应于纬度、经度(十进制度数)和时间

我有20组这样的阵列(即,1_-LAT、1_-LON、1_-TIM…20_-LAT、20_-LON、20_-TIM)

以下是我想要实现的目标:

1) 计算出每一组特定半径范围内的lat/lon组的数量。例如,在有效时间为1_TIM时,有多少点落在半径为1_LAT,1_LON的50公里范围内,与其他19组点相比。然后,我将遍历每个有效时间,以计算出每个特定点和有效时间的有效半径中的点数

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

黑色正方形表示LAT_1/LON_1阵列中的所有点。 蓝色方块表示横向/横向阵列中的所有点

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


我有一种感觉,KDEtree可能是实现这一目标的最佳方式,但我对这方面几乎没有经验。如有任何意见或建议,将不胜感激

您可以执行以下操作。。。首先,将每组的
(x,y)
坐标分组到一个
点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\u in_r[j,k]
包含
points\j
中有多少个点在
points\k
中一个点的半径
r


请记住,此处的距离是坐标的欧几里德距离,忽略它们测量的是球面角的事实。

由于这些值是lat/lon值,因此必须有更精确的方法来确定点是否在半径内。我已经下载了geopy(可以获得更精确的测量)。我将尝试修改代码以获得这样的值,但我仍然需要将所有这些映射到basemap中。我可能放弃这个解决方案,尝试使用shapely库。如果您担心lat/lon vs xyz,KDTree将沿最后一个轴接受任何维度参数。只需将你的点阵列从lat/long转换为xyz。但它不会测量沿球体表面的距离,而是直接穿过地球,对吗?与地球的曲率相比,半径为-50公里是相当小的。在50公里处,这两个点只需离地面几米,以避免穿过地球。假设它是一个完美的球体,没有树……我想知道是否有一个更简单的解决方案,使用Shapely library buffer工具,然后“求和”/将多边形叠加到某种热密度贴图中。