如何正确过滤HERE Traffic API结果,仅获取指定廊道的流量数据?
解决HERE Traffic API廊道结果过滤问题
为什么你之前的过滤方法没用
HERE Traffic API返回的shape字段是路段的简化几何轮廓(不是完整的道路路径),只检查单个坐标点是否在廊道内,会把那些“只有一小部分蹭到廊道”的路段也留下来——比如一条横穿廊道的路,只有端点在廊道里,但大部分都在外面,这种就会被误判。
正确的过滤逻辑
核心是计算路段与廊道的重叠占比,只保留“大部分在廊道内”的路段,步骤如下:
- 把你的廊道转换成缓冲区多边形
用几何处理工具把输入的廊道折线生成带宽度的缓冲区,这才是你真正要的“廊道范围”。 - 计算每条路段与缓冲区的重叠长度占比
对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
相关产品推荐
相关产品推荐

