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

如何正确过滤HERE Traffic API结果,仅获取指定廊道的流量数据?

解决HERE Traffic API廊道结果过滤问题

为什么你之前的过滤方法没用

HERE Traffic API返回的shape字段是路段的简化几何轮廓(不是完整的道路路径),只检查单个坐标点是否在廊道内,会把那些“只有一小部分蹭到廊道”的路段也留下来——比如一条横穿廊道的路,只有端点在廊道里,但大部分都在外面,这种就会被误判。

正确的过滤逻辑

核心是计算路段与廊道的重叠占比,只保留“大部分在廊道内”的路段,步骤如下:

  1. 把你的廊道转换成缓冲区多边形
    用几何处理工具把输入的廊道折线生成带宽度的缓冲区,这才是你真正要的“廊道范围”。
  2. 计算每条路段与缓冲区的重叠长度占比
    对API返回的每条路段,把它的shape坐标转换成折线,计算这条折线和缓冲区多边形的交集长度,再除以路段总长度,占比超过阈值(比如50%)就保留。

具体Python实现

先安装依赖:

pip install shapely flexpolyline requests

修改你的函数,加上过滤逻辑:

from shapely.geometry import LineString
import flexpolyline
import requests

API_KEY = "你的API密钥"

def get_corridor_data(corridor_points, width, overlap_threshold=0.5):
    # 1. 生成廊道缓冲区多边形(先转投影坐标系保证米级精度)
    corridor_line = LineString(corridor_points)
    corridor_line_3857 = corridor_line.transform(3857)  # 转墨卡托投影算米
    corridor_buffer_3857 = corridor_line_3857.buffer(width/2)
    corridor_buffer = corridor_buffer_3857.transform(4326)  # 转回经纬度

    # 2. 调用HERE API
    polyline = flexpolyline.encode(corridor_points)
    radius = int(width/2)
    response = requests.get(
        "https://data.traffic.hereapi.com/v7/flow",
        headers={"Content-Type": "*"},
        params={
            "apiKey": API_KEY,
            "in": f"corridor:{polyline};r={radius}",
            "locationReferencing": "shape"
        }
    )
    response.raise_for_status()
    flow_data = response.json()

    # 3. 过滤结果
    filtered_results = []
    for item in flow_data.get("results", []):
        # 解析路段的shape坐标
        shape_coords = flexpolyline.decode(item["location"]["shape"])
        segment_line = LineString(shape_coords)
        
        # 转投影坐标系计算长度(避免经纬度直接算长度的误差)
        segment_line_3857 = segment_line.transform(3857)
        total_length = segment_line_3857.length
        
        if total_length == 0:
            continue
        
        # 计算重叠长度
        intersection = segment_line_3857.intersection(corridor_buffer_3857)
        overlap_length = 0
        if intersection.geom_type == "MultiLineString":
            overlap_length = sum(line.length for line in intersection.geoms)
        elif intersection.geom_type == "LineString":
            overlap_length = intersection.length
        
        # 判断是否保留
        if overlap_length / total_length >= overlap_threshold:
            filtered_results.append(item)
    
    return filtered_results

关键注意事项

  • 坐标系转换:WGS84(经纬度)不能直接计算米级长度,必须转成墨卡托投影(EPSG:3857)再做几何运算,否则结果偏差极大。
  • 阈值调整:overlap_threshold可以按需修改,要严格就设0.7(70%重叠),宽松点设0.3。
  • 1x1公里网格问题:这是HERE API底层的瓦片机制,返回的是廊道所在瓦片内的所有路段,必须通过后处理过滤,官方文档未提及确实容易踩坑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 10:55:17