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图并注入流量数据
- 初始化有向图(道路多为单向,用有向图更贴合实际):
import networkx as nx G = nx.DiGraph() - 遍历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
相关产品推荐
相关产品推荐

