python - 根据纬度/经度和半径选择 geopandas 或 pandas 中的行
问题描述
我有一个数据框(pd),其中每一行都包含一堆度量以及latitude
值longitude
。如果需要,我可以将它们转换为 geopandas 点。
从这个数据框中,我想只选择从新的给定纬度/经度落在某个(比如说 1 公里)半径内的行。
有没有解决这个问题的明智方法?
这是来自 df 的数据样本:
id . lat . long . polution . label
----------------------------------------
3 . 45.467. -79.51 . 7 . 'nice'
7 . 45.312. -79.56 . 8 . 'mediocre'
样本 lat/long 将是lat = 45.4
and long = -79.5
。
解决方案
这是工作代码的示例。首先做一个函数来计算你的距离。我实现了一个简单的距离计算,但我会推荐你觉得最有用的那个。接下来,您可以将 DataFrame 子集化到您想要的距离内。
#Initialize DataFrame
df=pd.DataFrame(columns=['location','lat','lon'])
df['location']=['LA','NY','LV']
df['lat']=[34.05,40.71,36.16]
df['lon']=[-118.24,-74.00,-115.14]
#New point Reno 39.53,-119.81
newlat=39.53
newlon=-119.81
#Import trig stuff from math
from math import sin, cos, sqrt, atan2,radians
#Distance function between two lat/lon
def getDist(lat1,lon1,lat2,lon2):
R = 6373.0
lat1 = radians(lat1)
lon1 = radians(lon1)
lat2 = radians(lat2)
lon2 = radians(lon2)
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat / 2)**2 + cos(lat1) * cos(lat2) * sin(dlon / 2)**2
c = 2 * atan2(sqrt(a), sqrt(1 - a))
return R * c
#Apply distance function to dataframe
df['dist']=list(map(lambda k: getDist(df.loc[k]['lat'],df.loc[k]['lon'],newlat,newlon), df.index))
#This will give all locations within radius of 600 km
df[df['dist']<600]
推荐阅读
- javascript - 在静态网站上缓存来自前端 ajax 的后端响应的最佳实践?
- javascript - 我创建了一个构造函数 CAR,但它的意思是“c1.model();” 调用函数时不返回任何值
- python - 根据给定条件从数据框中过滤特定数据点
- android - 在 RxJava 中使用一个作为谓词组合两个可观察源
- javascript - 在 React 组件之外访问 Redux Store 返回初始值
- javascript - Js中forEach赋值
- javascript - Yargs 模块:没有提供足够的参数。预期 1 但收到 0
- r - 无法根据闪亮仪表板中的文本输入呈现表格
- db2 - 如何在 DB2 中检索存储在 CLOB 数据类型中的 JSON 数据?
- python - 如何使用 Zappa 从命令行将事件发送到 lambda_handler 函数