如何将 id 分配给坐标集? -python
How to assign ids to sets of coordinates? -python
我正在使用一个 GeoDataFrame (gdf)
包含如下所示的道路网络(线):
id_road speed geometry
0 1 50.00 LINESTRING (a_lon a_lat, b_lon b_lat)
1 2 50.00 LINESTRING (b_lon b_lat, c_lon c_lat)
2 3 48.00 LINESTRING (b_lon b_lat, e_lon e_lat)
3 4 50.00 LINESTRING (c_lon c_lat, d_lon d_lat)
4 5 51.00 LINESTRING (c_lon c_lat, f_lon f_lat)
...
下面是网络的简化图:
我想向 gdf
添加一组两个 ID。如果我们以上图中给出的例子为例:
- 第一个 id 将是道路的起点(例如,对于 Road_1,此 id 将是
begin_road
,它等于 1)。
- 第二个 id 将是路的尽头(例如 Road_1
end_road
= 2)。
但是我希望 Road_1 的 end_road
成为 Road_2 的 begin_road
。
我想过将坐标值与 id 值相关联,这样在 gdf
中我会得到:
- (a_lon, a_lat) = 1
- (b_lon, b_lat) = 2
- (c_lon, c_lat) = 3
- (d_lon, d_lat) = 4
- (e_lon, e_lat) = 5
- (f_lon, f_lat) = 6
id_road speed begin_road end_road geometry
0 1 50.00 1 2 LINESTRING (a_lon a_lat, b_lon b_lat)
1 2 50.00 2 3 LINESTRING (b_lon b_lat, c_lon c_lat)
2 3 48.00 2 5 LINESTRING (b_lon b_lat, e_lon e_lat)
3 4 50.00 3 4 LINESTRING (c_lon c_lat, d_lon d_lat)
4 5 51.00 3 6 LINESTRING (c_lon c_lat, f_lon f_lat)
...
我不确定如何设法对此进行编码,以及这种方法是否最适合我想要做的事情。有什么想法吗?
这是一个草率的实现,但如果它有帮助请告诉我:
首先,您可能需要某种方法将坐标对转换为您可以从中索引的坐标对列表:
coordinate_pairs = df['geometry'].apply(lambda g: [g.coords[0], g.coords[-1]])
coordinates = [p for pair in coordinate_pairs for p in pair]
coordinates_to_index = {tuple(coordinates[i]): i for i in range(len(coordinates))}
之后您可以检索索引以创建新列:
df['begin_road'] = df['geometry'].apply(lambda g: coordinates_to_index.get(g.coords[0]))
df['end_road'] = df['geometry'].apply(lambda g: coordinates_to_index.get(g.coords[-1]))
我正在使用一个 GeoDataFrame (gdf)
包含如下所示的道路网络(线):
id_road speed geometry
0 1 50.00 LINESTRING (a_lon a_lat, b_lon b_lat)
1 2 50.00 LINESTRING (b_lon b_lat, c_lon c_lat)
2 3 48.00 LINESTRING (b_lon b_lat, e_lon e_lat)
3 4 50.00 LINESTRING (c_lon c_lat, d_lon d_lat)
4 5 51.00 LINESTRING (c_lon c_lat, f_lon f_lat)
...
下面是网络的简化图:
我想向 gdf
添加一组两个 ID。如果我们以上图中给出的例子为例:
- 第一个 id 将是道路的起点(例如,对于 Road_1,此 id 将是
begin_road
,它等于 1)。 - 第二个 id 将是路的尽头(例如 Road_1
end_road
= 2)。
但是我希望 Road_1 的 end_road
成为 Road_2 的 begin_road
。
我想过将坐标值与 id 值相关联,这样在 gdf
中我会得到:
- (a_lon, a_lat) = 1
- (b_lon, b_lat) = 2
- (c_lon, c_lat) = 3
- (d_lon, d_lat) = 4
- (e_lon, e_lat) = 5
- (f_lon, f_lat) = 6
id_road speed begin_road end_road geometry
0 1 50.00 1 2 LINESTRING (a_lon a_lat, b_lon b_lat)
1 2 50.00 2 3 LINESTRING (b_lon b_lat, c_lon c_lat)
2 3 48.00 2 5 LINESTRING (b_lon b_lat, e_lon e_lat)
3 4 50.00 3 4 LINESTRING (c_lon c_lat, d_lon d_lat)
4 5 51.00 3 6 LINESTRING (c_lon c_lat, f_lon f_lat)
...
我不确定如何设法对此进行编码,以及这种方法是否最适合我想要做的事情。有什么想法吗?
这是一个草率的实现,但如果它有帮助请告诉我:
首先,您可能需要某种方法将坐标对转换为您可以从中索引的坐标对列表:
coordinate_pairs = df['geometry'].apply(lambda g: [g.coords[0], g.coords[-1]])
coordinates = [p for pair in coordinate_pairs for p in pair]
coordinates_to_index = {tuple(coordinates[i]): i for i in range(len(coordinates))}
之后您可以检索索引以创建新列:
df['begin_road'] = df['geometry'].apply(lambda g: coordinates_to_index.get(g.coords[0]))
df['end_road'] = df['geometry'].apply(lambda g: coordinates_to_index.get(g.coords[-1]))