问题描述
我有一个很大的 csv,其中包含 1 秒间隔内每个点的行程数据信息:lon、lat、timestamp 和 street_id。 我的目标是将街道分割为 10m 长的路段,并根据每个点的位置为每个点分配一个唯一的路段 ID。
以下是使用 df.head()
显示我的数据的示例:
timestamp Lat Lon street_id
0 4/1/2014 0:11:00 40.7690 -73.9549 140
1 4/1/2014 0:17:00 40.7267 -74.0345 50
我正在使用 goepandas 来获取空间数据框:
from geopandas import GeoDataFrame
from shapely.geometry import Point
geometry = [Point(xy) for xy in zip(df.Lon,df.Lat)]
df = df.drop(['Lon','Lat'],axis=1)
gdf = GeoDataFrame(df,crs="epsg:4326",geometry=geometry)
我只是不知道如何开始,我知道我必须按 street_id 分组然后计算每个点与街道起点之间的距离,但我找不到如何找到如何这样做
预期结果应如下所示:
timestamp Lat Lon street_id segment_id
0 4/1/2014 0:11:00 40.7690 -73.9549 140 5
1 4/1/2014 0:17:00 40.7267 -74.0345 50 1
Segment_id 应该是每个 10m 长街道段的唯一标识符
解决方法
10m 分辨率对应于纬度或经度的第 4 位数字的变化。因此,您甚至不必按 street_id
对点进行分组,只需为元组的所有不同组合(纬度、经度)分配唯一 id:
zz = df[['Lat','Lon']].value_counts()
lut = {k:ix for ix,k in enumerate(zz.index.values)}
df['segment_id'] = df.apply(lambda xx: lut[(xx['Lat'],xx['Lon'])],axis=1)