基于OSMnx提取车道链路及解决内存占用过高问题技术求助
针对车道链路提取的OSMnx解决方案
问题背景
你需要构建两类链路:
- 主路链路:相邻交叉口间的路径(已通过自定义过滤器成功提取)
- 车道链路:每条车道的独立路径(忽略交叉口)
但复用主路的过滤器提取车道时,因数据量过大耗尽内存,需要针对性的优化方案。
核心原因
原过滤器针对道路级别数据提取,会拉取所有符合条件的道路及其附属的车道信息,加上OSMnx构建拓扑图的额外开销,导致内存溢出。车道属于道路的子要素,需要直接定位到OSM中的车道标签,而非道路本身。
具体解决方案
1. 精准定位车道要素的自定义过滤器
OSM中代表机动车道的要素标签为highway=lane,配合motor_vehicle=yes可过滤出机动车专用车道,过滤器如下:
cf = '["highway"="lane"]["motor_vehicle"="yes"]'
如果需要包含更多非专用但允许机动车通行的车道,可调整为:
cf = '["highway"="lane"]["motor_vehicle"!="no"]'
2. 改用几何提取而非拓扑图构建
不需要交叉口拓扑的情况下,使用ox.geometries_from_place替代ox.graph_from_place,直接提取车道的原始几何数据,避免构建拓扑结构的内存开销:
import osmnx as ox import pandas as pd ox.config(use_cache=True, log_console=True) # 提取悉尼范围内的机动车道几何数据 lanes_gdf = ox.geometries_from_place( 'Sydney, New South Wales, Australia', tags={'highway': 'lane', 'motor_vehicle': 'yes'} ) # 只保留必要字段,减少内存占用 lanes_gdf = lanes_gdf[['geometry', 'highway', 'motor_vehicle']]
3. 分区域提取优化内存
若悉尼范围过大,可划分成小网格逐个提取再合并,避免一次性加载全量数据:
# 获取悉尼城市边界 city_gdf = ox.geocode_to_gdf('Sydney, New South Wales, Australia') city_geom = city_gdf.geometry.iloc[0] # 划分1km边长的网格(可根据内存调整大小) grids = ox.utils_geo._quadrat_cut_geometry(city_geom, quadrat_width=1000) all_lanes = [] for idx, grid in enumerate(grids): print(f"处理第 {idx+1}/{len(grids)} 个网格") try: lane_grid = ox.geometries_from_place( grid, tags={'highway': 'lane', 'motor_vehicle': 'yes'} ) all_lanes.append(lane_grid) except Exception as e: print(f"网格处理失败: {str(e)}") # 合并所有网格的车道数据 lanes_gdf = pd.concat(all_lanes, ignore_index=True)
4. 额外内存优化建议
- 关闭不必要的日志:
ox.config(log_console=False) - 将字符串字段设为
category类型,减少内存占用:lanes_gdf['highway'] = lanes_gdf['highway'].astype('category') lanes_gdf['motor_vehicle'] = lanes_gdf['motor_vehicle'].astype('category')
内容的提问来源于stack exchange,提问作者gpvt
相关产品推荐
相关产品推荐

