OSRM特定道路限行时段配置无效问题排查及方案咨询
问题排查与解决方案
原代码的核心错误
- 车辆类型匹配错误:原代码用
*会禁止所有车辆通行,不符合仅禁止出租车的需求,需明确指定taxi类型。 - 街道名匹配失效:目标街道是越南语的
Cầu Giấy,原代码用无重音的Cau Giay无法匹配带重音的原名,导致规则根本没作用到目标道路上。 - OSRM API语法错误:直接赋值
result.restriction不符合OSRM Lua脚本的权限配置规范,正确做法是通过access字段配置带时段条件的通行权限。
修正后的Lua脚本
function restrict(way, result) local name = way:get_value_by_key('name') if name then -- 标准化街道名:去掉重音、转小写,确保匹配到目标街道 local normalized_name = string.gsub(string.lower(name), '[áàảãạăắằẳẵặâấầẩẫậéèẻẽẹêếềểễệíìỉĩịóòỏõọôốồổỗộơớờởỡợúùủũụưứừửữựýỳỷỹỵ]', function(c) local accent_map = { ['á']='a', ['à']='a', ['ả']='a', ['ã']='a', ['ạ']='a', ['ă']='a', ['ắ']='a', ['ằ']='a', ['ẳ']='a', ['ẵ']='a', ['ặ']='a', ['â']='a', ['ấ']='a', ['ầ']='a', ['ẩ']='a', ['ẫ']='a', ['ậ']='a', ['é']='e', ['è']='e', ['ẻ']='e', ['ẽ']='e', ['ẹ']='e', ['ê']='e', ['ế']='e', ['ề']='e', ['ể']='e', ['ễ']='e', ['ệ']='e', ['í']='i', ['ì']='i', ['ỉ']='i', ['ĩ']='i', ['ị']='i', ['ó']='o', ['ò']='o', ['ỏ']='o', ['õ']='o', ['ọ']='o', ['ô']='o', ['ố']='o', ['ồ']='o', ['ổ']='o', ['ỗ']='o', ['ộ']='o', ['ơ']='o', ['ớ']='o', ['ờ']='o', ['ở']='o', ['ỡ']='o', ['ợ']='o', ['ú']='u', ['ù']='u', ['ủ']='u', ['ũ']='u', ['ụ']='u', ['ư']='u', ['ứ']='u', ['ừ']='u', ['ử']='u', ['ữ']='u', ['ự']='u', ['ý']='y', ['ỳ']='y', ['ỷ']='y', ['ỹ']='y', ['ỵ']='y' } return accent_map[c] or c end) -- 匹配标准化后的街道名 if string.find(normalized_name, 'cau giay') then -- 配置权限:出租车平时可通行,指定时段禁止通行 result.access = (result.access or '') .. 'taxi: yes; taxi @ (Mo-Fr 16:00-19:00): no;' end end end function way_function(way) local result = {} restrict(way, result) return result end
验证步骤
- 确认地图数据:用Overpass Turbo查询目标街道,确保其
name字段确实为Cầu Giấy(或包含该名称)。 - 重建OSRM数据:修改脚本后,重新执行
osrm-extract和osrm-contract命令生成新的路由数据。 - API测试:调用OSRM的路由API时,指定
profile=taxi,并设置出发时间在16:00-19:00之间,检查路线是否绕开了Cau Giay街道。
内容的提问来源于stack exchange,提问作者the rocket
相关产品推荐
相关产品推荐

