根据纬度/经度和半径在大熊猫或大熊猫中选择行

问题描述 投票:0回答:2

我有一个数据帧(pd),其中每一行包含一堆测量值以及latitudelongitude值。如果需要,我可以将其转换为geopandas点。

从此数据框中,我只选择从新的给定纬度/经度到特定(例如1公里)半径内的行。

是否有解决此问题的明智方法?

这是来自df的数据样本:

id .  lat  .  long  . polution . label
----------------------------------------
3  . 45.467. -79.51 .    7     . 'nice'
7  . 45.312. -79.56 .    8     . 'mediocre'

样本经度/纬度应为lat = 45.4long = -79.5

python database pandas gis geopandas
2个回答
1
投票

这里是一个工作代码示例。首先创建一个函数来计算您的距离。我实现了一个简单的距离计算,但是我建议您觉得最有用的方法。接下来,您可以将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]

0
投票

您可以使用以下算法:

  1. 根据输入数据(pd数据框)创建地理数据框(gdfdata

  2. 创建另一个地理数据框(gdfsel),使其具有选择的中心点

  3. 围绕中心点创建缓冲区(从gdfselbuff生成gdfsel从中进行选择

    ] >>
  4. 使用geopandas的within方法在其中查找点。例如。 gdf_within = gdfdata.loc[gdfdata.geometry.within(gdfselbuff.unary_union)]

  5. 要制作缓冲区,您可以使用GeoSeries.buffer(distance, resolution))。请参阅这些链接以供参考。

http://geopandas.org/geometric_manipulations.html

https://gis.stackexchange.com/questions/253224/geopandas-buffer-using-geodataframe-while-maintaining-the-dataframe

© www.soinside.com 2019 - 2024. All rights reserved.