【问题标题】:Average measure for all GPS points within certain range特定范围内所有 GPS 点的平均测量值
【发布时间】:2020-11-13 15:57:50
【问题描述】:

我有一个带有纬度、经度和 100K+ GPS 点的 pandas 数据框。

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

但是我将如何迭代行,选择 10m 范围内的点并对度量进行平均?

我猜是某种 groupby,但不知道怎么做。

【问题讨论】:

标签: python pandas gps pandas-groupby distance


【解决方案1】:

在此示例中,点本身始终包含在自身中。使其成为平均值本身的一部分。如果要排除点本身,则需要修改该部分。

我们可以使用 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')

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

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

【讨论】:

  • 太棒了,非常感谢!这正是我正在寻找的,我确实想将这一点本身包括在平均值中。到目前为止,我从未听说过 BallTree,将不得不深入研究它。
猜你喜欢
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-04
  • 1970-01-01
  • 2016-03-25
相关资源
最近更新 更多