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

HERE Traffic API:如何基于流量数据在Python中构建networkx图

解决方案:用HERE API流量数据构建NetworkX路网图

一、从HERE API获取带连接关系的流量数据

HERE Traffic API其实支持返回带路段唯一标识和相邻连接的字段,你之前可能没用到正确的请求参数:

  • 调用Traffic Flow API的flowSegmentData端点时,添加includeReferences=linkId,adjacentLinks参数,返回的每个流量段会包含唯一linkId(HERE路网链路ID)和上下游相邻路段的linkId列表,直接拿到道路连接关系,无需依赖外部路网匹配。
  • 示例请求参数(伪代码):
    params = {
        'apiKey': 'YOUR_API_KEY',
        'bbox': '52.509,13.375,52.529,13.405',
        'includeReferences': 'linkId,adjacentLinks',
        'responseattributes': 'sh,fc'  # 同时获取路段形状、功能等级
    }
    

二、构建NetworkX图并注入流量数据

  1. 初始化有向图(道路多为单向,用有向图更贴合实际):
    import networkx as nx
    
    G = nx.DiGraph()
    
  2. 遍历HERE返回的流量数据,批量添加节点、边及流量属性:
    for segment in traffic_data['flowSegmentData']:
        current_link = segment['linkId']
        # 提取路段起止坐标,作为节点位置属性
        shape_points = segment['shape']['value'].split(';')
        start_pos = tuple(map(float, shape_points[0].split(',')))
        end_pos = tuple(map(float, shape_points[-1].split(',')))
        
        # 添加节点(避免重复创建)
        if current_link not in G.nodes:
            G.add_node(current_link, pos=start_pos)
        
        # 基于相邻路段ID添加连接边,注入流量属性
        for adj_link in segment['adjacentLinks']:
            G.add_edge(
                current_link, adj_link,
                speed=segment['speed'],
                jam_factor=segment['jamFactor'],
                free_flow_speed=segment['freeFlowSpeed']
            )
    

三、HERE+OSM精准匹配方案(解决重名问题)

如果必须用OSM路网,放弃道路名称匹配,改用空间几何+属性校验的方式:

  • 用shapely将HERE路段的经纬度序列转为LineString
  • 用osmnx获取目标区域OSM路网,将路段也转为LineString
  • 以空间距离(比如50米内)为首要匹配条件,再校验道路功能等级(HERE的functionalClass与OSM的highway属性对应),彻底规避重名问题
  • 示例代码片段:
    from shapely.geometry import LineString
    import osmnx as ox
    
    # 获取OSM驾车路网
    osm_graph = ox.graph_from_bbox(52.509,52.529,13.375,13.405, network_type='drive')
    osm_edges = ox.graph_to_gdfs(osm_graph, nodes=False)
    
    # 处理HERE路段几何
    here_line = LineString([tuple(map(float, p.split(','))) for p in segment['shape']['value'].split(';')])
    # 空间匹配+功能等级校验
    matched_osm = osm_edges[osm_edges.geometry.distance(here_line) < 50]
    # HERE功能等级与OSM道路类型映射
    fc_map = {1: 'motorway', 2: 'trunk', 3: 'primary', 4: 'secondary', 5: 'tertiary'}
    matched_osm = matched_osm[matched_osm['highway'] == fc_map[segment['functionalClass']]]
    

四、关键注意事项

  • HERE的linkId全局唯一,单向/双向路段对应不同ID,用有向图更准确
  • 流量数据为实时/准实时,需定期刷新图的边属性
  • 若adjacentLinks返回不全,可缩小请求的bbox范围或调整maxResults参数

内容的提问来源于stack exchange,提问作者7p4

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 13:00:02