使用osm2pgsql导入OSM数据后,边界框查询缺失限行规则
解决方案
1. 核心问题:OSM限行规则的存储方式
OSM中绝大多数限行规则(如禁止左转、禁止直行、禁止驶入等)并非直接附着在道路way节点上,而是以**关系(relation)**的形式存储,关系类型标记为restriction。你当前的配置仅导入了节点和道路上的restriction标签,完全遗漏了关系型限行规则,这是结果缺失的主要原因。
2. 调整导入配置
传统样式文件(default.style)方案
在default.style中添加关系类型的限行规则映射:
relation restriction text relation relation restriction:conditional text relation
你的导入命令已包含-G参数,会生成存储关系数据的planet_osm_rels表,无需修改导入命令,但必须重新导入数据才能生效。
Flex模式Lua脚本方案
若使用你修改的兼容模式Lua脚本,需补充关系处理逻辑:
- 在
process_relation函数中,判断tags.type == 'restriction' - 将
restriction、restriction:conditional等标签以及关系中的from/to/via成员信息存储到专门的关系表,或关联到道路表 - 确保脚本正确解析关系成员的类型和ID,建立道路与限行规则的关联
3. 修改查询逻辑
由于限行规则主要存储在关系表中,查询时需要关联planet_osm_rels、planet_osm_members和planet_osm_line表:
SELECT DISTINCT r.tags->'restriction', r.tags->'restriction:conditional' FROM planet_osm_rels r JOIN planet_osm_members m ON r.osm_id = m.rel_id JOIN planet_osm_line l ON m.member_id = l.osm_id WHERE r.tags->'type' = 'restriction' AND l.highway IN ('motorway', 'trunk', 'primary', 'secondary', 'tertiary', 'unclassified', 'residential', 'motorway_link', 'trunk_link', 'primary_link', 'secondary_link', 'tertiary_link') AND ST_Intersects(l.way, ST_Transform(ST_MakeEnvelope(10.91492, 47.41136, 13.41705, 49.07207, 4326), 3857));
4. 验证步骤
- 重新导入OSM数据,确保新配置生效
- 检查
planet_osm_rels表中是否存在type='restriction'的记录 - 对比外部工具的结果,确认限行规则类型已完整覆盖
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

