在参加一些表格条件后,我需要溶解来自 a
geodataframe
的所有彼此相交的线串:1)具有相同的
ID
和 2)具有相同的
opening
年份。这些数据代表道路数据库,我正在使用
geopandas
数据如下所示:
id opening geometry
0 30 2020 LINESTRING (45.01679 -12.12937, 45.01681 -12...
1 101 1999 LINESTRING (37.02849 -10.65968, 37.02849 -10...
2 30 2019 LINESTRING (47.10667 -15.49339, 47.10665 -15...
3 101 1999 LINESTRING (41.64170 -12.45764, 41.64180 -12...
4 135 2020 LINESTRING (45.31902 -9.76800, 45.31907 -9.7...
我尝试了以下代码:
import geopandas as gpd
import numpy as np
import shapely
gdf_sof = gpd.read_file('your_path/your_file')
# Concatenate the conected segments
gdf = gpd.GeoDataFrame()
for id in gdf_sof.id.unique():
print(id)
unique_id = gdf_sof.loc[gdf_sof.id == id]
print(unique_id.shape)
gdf_sof_id = gpd.GeoDataFrame()
for dt in unique_id.opening.unique():
print(dt)
unique_oppening = unique_id.loc[unique_id.opening == dt]
dissolved = gpd.geoseries.GeoSeries([geom for geom in unique_oppening.unary_union.geoms])
gdf_sof_id = pd.concat([gdf_sof_id, dissolved], ignore_index=True, axis=0)
gdf.concat(gdf_sof_id, ignore_index=True, axis=0, inplace=True)
gdf.shape
但收到了此错误消息:
---------------------------------------------------------------------------
AttributeError: 'LineString' object has no attribute 'geoms'
我还根据@Pieter的评论尝试了以下代码,但结果并不令人满意。我使用了
linemerge
和
shapely.get_parts
import geopandas as gpd
import numpy as np
import pandas as pd
import shapely
from shapely.ops import linemerge
gdf_sof = gpd.read_file('your_path/your_file')
# Dissolve the connected segments
gdf = gpd.GeoDataFrame()
for id in gdf_sof.id.unique():
unique_id = gdf_sof.loc[gdf_sof.id == id]
gdf_sof_id = gpd.GeoDataFrame()
for dt in unique_id.opening.unique():
unique_opening = unique_id.loc[unique_id.opening == dt]
shp = shapely.get_parts(unique_opening.geometry)
dissolved = linemerge(shp)
gdf_dissolved = gpd.GeoDataFrame({'id': [id],
'opening': [dt],
'geometry':dissolved},
geometry = 'geometry',
crs = gdf_sof.crs)
gdf_sof_id = pd.concat([gdf_sof_id, gdf_dissolved], ignore_index=True, axis=0)
gdf = pd.concat([gdf, gdf_sof_id], ignore_index=True, axis=0)
gdf.shape
我的起始 gdf (
gdf_sof
) 的形状为
(7366, 3)
,最终的
gdf
的形状为
(973, 3)
然而,最终的 gdf
(973,3)
溶解了不接触的段。
上图中所有突出显示的段只是属性表中的一行。我需要他们分开!
错误是由于试图将
unary_union
属性(用于生成新的几何图形)应用于
GeoSeries
中的单个
LineString
几何图形而发生的。
unary_union
操作应该在几何图形集合上执行,而不是在单个几何图形上执行。
相反,请尝试使用
dissolve
函数来基于
id
和
opening
列对的 GeoDataFrame 进行分组,并将聚合函数设置为
'first'
以保留其他列。然后,将
explode
应用于结果以将多部分几何图形拆分为单独的特征:
import geopandas as gpd
# 从的文件读取 GeoDataFrame
gdf_sof = gpd.read_file('your_path/your_file')
# 基于 'id' 和 'opening' 列进行溶解,并保留其他列
gdf = gdf_sof.dissolve(by=['id', 'opening'], aggfunc='first')
# 将多部分几何图形炸开成单独的特征
gdf = gdf.explode(ignore_index=True)
# 打印结果 GeoDataFrame 的形状
print(gdf.shape)
此代码将首先根据
id
和
opening
列的组合对 GeoDataFrame 进行分组。然后,它将溶解每个组内的几何图形,有效地合并具有相同
id
和
opening
年份的所有相交线段。
aggfunc='first'
确保将保留来自原始 GeoDataFrame 的
id
和
opening
列。最后,
explode
函数将任何多部分几何图形(由溶解操作创建)拆分为单独的特征,从而为提供所需的结果。