一定范围内所有 GPS 点的平均测量

Average measure for all GPS points within certain range

我有一个 pandas 数据框,其中包含纬度、经度和 100K+ GPS 点的测量值。

df = pd.DataFrame({'lat': [41.260637, 45.720185, 45.720189, 45.720214, 45.720227, 46.085716, 46.085718, 46.085728, 46.085730, 46.085732], 
          'lng': [2.825920, 3.068014, 3.068113, 3.067929, 3.068199, 3.341655, 3.341534, 3.341476, 3.341546, 3.341476], 
      'measure': [6.30000, -0.375000, -0.375000, -0.375000, -0.375000, 0.000000, 0.000000, 0.555556, 0.714286, 0.645833]})

我想要做的是,对于这些点中的每一个,计算 10 米范围内所有点的度量列的平均值。

我知道如何使用geopy

计算两点之间的距离
from geopy.distance import distance
distance([gps_points.lat[3], gps_points.lng[3]], [gps_points.lat[4], gps_points.lng[4]]).m

21.06426497936181

但是我该如何迭代行,选择 10 米范围内的点并取平均值?

我猜是某种 groupby,但不知道如何实现。

在这个例子中,点本身总是被包含在内。使其成为平均值本身的一部分。如果您想排除该点本身,则需要修改该部分。

我们可以使用 BallTree

import pandas as pd
from sklearn.neighbors import BallTree
import numpy as np

以及您的示例数据

df = pd.DataFrame({'lat': [41.260637, 45.720185, 45.720189, 45.720214, 45.720227, 46.085716, 46.085718, 46.085728, 46.085730, 46.085732], 
          'lng': [2.825920, 3.068014, 3.068113, 3.067929, 3.068199, 3.341655, 3.341534, 3.341476, 3.341546, 3.341476], 
      'measure': [6.30000, -0.375000, -0.375000, -0.375000, -0.375000, 0.000000, 0.000000, 0.555556, 0.714286, 0.645833]})

我们可以用

创建一棵树
gps_pairs = df[["lat", "lng"]].values
radians =  np.radians(gps_pairs)

tree = BallTree(radians, leaf_size=15, metric='haversine')

现在我们需要缩放以获得 10 米的半径(大约):

distance_in_meters = 10
earth_radius = 6371000
    
radius = distance_in_meters / earth_radius

查询radius
is_within, distances = tree.query_radius(radians, r=radius, count_only=False, return_distance=True) 

is_within 将包含落在 10 米以内的点的索引。

现在您可以使用以下方法计算平均测量值:

measures = df[['measure']].values

average_measure_for_withins = np.array([ np.mean( measures[withins] ) for withins in is_within ])

例如将其添加到 DF

df['average_for_withins'] = average_measure_for_withins