You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 22:02:02