根据纬度和经度计算给定半径内的点数



我有一个点的数据帧,其id名称和纬度/经度为:

df = pd.DataFrame({'id':list('abcde'),'latitude': [38.470628, 37.994155, 38.66937, 34.119578, 36.292307],'longitude': [-121.404586, -121.802341, -121.295325, -117.413791, -119.804074]})  #sample

对于每个id,我需要计算(同一数据集的(位于距离它2英里半径内的点的数量。

问题:如何在Python中以最简单的方式做到这一点?

这个问题有些模棱两可。你需要的第一个组件是一个计算两个坐标之间距离的函数,这需要一些三角法,并且在以下问题中有几个实现。

完成函数后,只需在所有点上循环并进行计算。可能有比两个嵌套循环更有效的方法,但这是最简单的。

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

样本数据

df = pd.DataFrame({'id':list('abcde'),'latitude': [38.470628, 37.994155, 38.66937, 34.119578, 36.292307],'longitude': [-121.404586, -121.802341, -121.295325, -117.413791, -119.804074]})  #sample

提取lat、long并转换为弧度。当转换为单位球体时,计算所需的半径。

coords = df[["latitude","longitude"]]
distance_in_miles = 50
earth_radius_in_miles = 3958.8
radius = distance_in_miles / earth_radius_in_miles
tree = BallTree( np.radians(coords), leaf_size=10, metric='haversine')
tree.query_radius( np.radians(coords), r=radius, count_only=True)

哪个给出array([3, 2, 2, 1, 1])


如果您想返回标记并将其用于骨料;一种方法是

df = pd.DataFrame({'id':list('abcde'),'latitude': [38.470628, 37.994155, 38.66937, 34.119578, 36.292307],'longitude': [-121.404586, -121.802341, -121.295325, -117.413791, -119.804074], 'saleprice_usd_per_sqf': [200, 300, 700, 350, 50]})
coords = df[["latitude","longitude"]]
distance_in_miles = 50
earth_radius_in_miles = 3958.8
radius = distance_in_miles / earth_radius_in_miles

注意,我们在这里使用标记,而不仅仅是计数;

tree = BallTree( np.radians(coords), leaf_size=10, metric='haversine')
indici = tree.query_radius( np.radians(coords), r=radius, count_only=False)

例如,使用列表理解来获得每个半径的中值。请注意,点本身始终包含在其自身的半径中。

[np.median(df.saleprice_usd_per_sqf.values[idx]) for idx in indici]

最新更新