使用Python的gtfs_functions库时cut_gtfs函数报TypeError错误求助
解决gtfs_functions库cut_gtfs函数的TypeError问题
问题
使用gtfs_functions库的cut_gtfs函数时触发TypeError: object of type 'GeometryCollection' has no len()错误。
代码示例
routes, stops, stop_times, trips, shapes = gtfs.import_gtfs("C:/Users/charl/OneDrive/Bureau/car_dependency/Data/tisseo_gtfs_v2.zip") cutoffs = [0, 6, 9, 15, 19, 22, 24] stop_freq = gtfs.stops_freq(stop_times, stops, cutoffs=cutoffs) line_freq = gtfs.lines_freq(stop_times, trips, shapes, routes, cutoffs=cutoffs) segments_gdf = gtfs.cut_gtfs(stop_times, stops, shapes)
完整错误信息
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) Cell In[79], line 1 ----> 1 segments_gdf = gtfs.cut_gtfs(stop_times, stops, shapes) File c:\Users\charl\anaconda3\envs\inequality2\Lib\site-packages\gtfs_functions\gtfs_funtions.py:343, in cut_gtfs(stop_times, stops, shapes) 340 loops_direction_id.append(direction_id) 341 loops_shape_id.append(shape_id) --> 343 segments = [cut_shapes_(shape_trans_lines[i], shape_closest_points[i]) for i in range(0, len(shape_trans_lines))] 345 # Remove None values 346 segments = [i for i in segments if i] File c:\Users\charl\anaconda3\envs\inequality2\Lib\site-packages\gtfs_functions\gtfs_funtions.py:343, in <listcomp>(.0) 340 loops_direction_id.append(direction_id) 341 loops_shape_id.append(shape_id) --> 343 segments = [cut_shapes_(shape_trans_lines[i], shape_closest_points[i]) for i in range(0, len(shape_trans_lines))] 345 # Remove None values 346 segments = [i for i in segments if i] File c:\Users\charl\anaconda3\envs\inequality2\Lib\site-packages\gtfs_functions\gtfs_funtions.py:330, in cut_gtfs.<locals>.cut_shapes_(shape_trans_lines, shape_closest_points) 327 cut_points = MultiPoint(cut_points[1:-1]) 328 result = split(line, cut_points) --> 330 if len(result)==len(trans_lines_all)-1: 331 d['segment'] = [s for s in result] 333 return d TypeError: object of type 'GeometryCollection' has no len()
解决方案
1. 过滤无效几何数据
GTFS数据中的shapes可能包含GeometryCollection类型的几何,而cut_gtfs函数仅支持LineString或MultiLineString。直接过滤掉这些无效几何:
# 仅保留LineString和MultiLineString类型的几何 shapes = shapes[shapes.geometry.type.isin(['LineString', 'MultiLineString'])] # 重新调用cut_gtfs segments_gdf = gtfs.cut_gtfs(stop_times, stops, shapes)
2. 修复GeometryCollection
如果GeometryCollection中包含有效线段,可以提取其中的LineString元素:
from shapely.geometry import LineString, MultiLineString, GeometryCollection def extract_valid_lines(geom): if isinstance(geom, GeometryCollection): valid_lines = [] for g in geom.geoms: if isinstance(g, LineString): valid_lines.append(g) elif isinstance(g, MultiLineString): valid_lines.extend(list(g.geoms)) if valid_lines: return MultiLineString(valid_lines) if len(valid_lines) > 1 else valid_lines[0] return None return geom # 修复几何列 shapes['geometry'] = shapes['geometry'].apply(extract_valid_lines) # 删除修复后为空的行 shapes = shapes.dropna(subset=['geometry']) # 调用cut_gtfs segments_gdf = gtfs.cut_gtfs(stop_times, stops, shapes)
3. 修改库函数(临时方案)
找到库文件gtfs_funtions.py(路径:c:\Users\charl\anaconda3\envs\inequality2\Lib\site-packages\gtfs_functions\gtfs_funtions.py),定位到cut_shapes_函数的330行,添加类型判断和处理:
# 原代码 # if len(result)==len(trans_lines_all)-1: # 修改为: if isinstance(result, GeometryCollection): # 提取其中的有效线段 result = [g for g in result.geoms if isinstance(g, (LineString, MultiLineString))] if len(result)==len(trans_lines_all)-1:
内容的提问来源于stack exchange,提问作者Charlotte Liotta
相关产品推荐
相关产品推荐

