在 osmchina 数据库中检索中国高速公路网的实战指南
中国国家高速公路网(National Trunk Highway System / 71118网,如 G4 京港澳高速、G2 京沪高速、G30 连霍高速、G42 沪蓉高速等)是全国客货物流的大动脉。
在 OpenStreetMap 中,高速公路的数据建模与普通道路有较大差异。本文系统总结在本地 osmchina(33GB)数据库中,如何高效查询高速公路全网、处理双向分离车道,以及生成沿线行政区空间图层的技术方案。
一、中国高速在 OSM 中的数据组织特点
高速公路通常全封闭、立交化,其在 OSM 中的组织方式主要有三个鲜明特征:
highway = 'motorway'物理标签:- 所有的主干车道均标记为
motorway,进出匝道标记为motorway_link。 planet_osm_roads表专为大尺度地图优化,预先保留了所有的motorway,因此做纯线形预览时可直接查询planet_osm_roads。
- 所有的主干车道均标记为
- 方向分离的双关系组织(Dual-Direction Routes):
- 因为高速公路上下行完全隔离且互通匝道不同,OSM 通常将国家高速拆分为两个反向关系。
- 例如 G4 京港澳高速:
12902067:京港澳高速(北京方向,2,205 ways)12902068:京港澳高速(港澳方向,2,223 ways)
- 实战注意:在提取整条国家高速时,应将双向关系合并聚拢,或者选取任一主方向作为轴线。
- 编号规则规范(71118 网):
- 首都放射线:G1 ~ G9(如 G2 京沪、G4 京港澳、G5 京昆)。
- 南北纵线:两位奇数 G11 ~ G89(如 G15 沈海、G45 大广)。
- 东西横线:两位偶数 G10 ~ G90(如 G30 连霍、G42 沪蓉、G50 沪渝)。
- 环线与联络线:四位编号(如 G4202 成都绕城、G1503 上海绕城)。
二、高效检索高速公路的 SQL 技巧
技巧 1:从 planet_osm_rels 检索国家高速关系
-- 检索指定国家高速(如 G4 京港澳高速)的所有主线关系
SELECT
id,
tags->>'name' AS name,
tags->>'ref' AS ref,
tags->>'wikidata' AS wikidata,
jsonb_array_length(members) AS way_count
FROM planet_osm_rels
WHERE tags->>'ref' ILIKE 'G4'
AND (tags->>'type' = 'route' OR tags->>'type' = 'superroute')
AND (tags->>'route' = 'road' OR tags->>'route' = 'motorway')
ORDER BY jsonb_array_length(members) DESC;
技巧 2:双向路段去重聚合并计算高速里程
将双向关系涉及的 Way ID 进行 DISTINCT 统一后,通过 ST_LineMerge(ST_Union(...)) 提取主轴线:
WITH g4_ways AS (
SELECT DISTINCT (m->>'ref')::bigint AS way_id
FROM planet_osm_rels, jsonb_array_elements(members) m
WHERE id IN (12902067, 12902068) AND (m->>'type') = 'W'
)
SELECT
COUNT(l.osm_id) AS way_count,
ROUND((SUM(ST_Length(l.way)) / 1000)::numeric, 1) AS total_way_km,
-- 抽稀输出全线矢量 GeoJSON (约 150KB)
ST_AsGeoJSON(ST_Simplify(ST_Transform(ST_Union(l.way), 4326), 0.001)) AS geojson
FROM g4_ways w
JOIN planet_osm_line l ON l.osm_id = w.way_id;
技巧 3:利用空间拓扑提取沿线地级市与区县
通过合并后的干线多边形包围盒,与行政区多边形进行 ST_Intersects 关联求交,并在融合时使用 ST_Buffer(ST_MakeValid(geom), 0) 保证几何合法性:
WITH g4_line AS (
-- 提取 G4 高速合并几何
SELECT ST_Transform(ST_Union(l.way), 4326) AS geom
FROM planet_osm_line l
WHERE l.osm_id IN (/* G4 关联的所有 way_id */)
)
SELECT
c.adcode,
c.name,
c.level
FROM map_province c, g4_line r
WHERE c.geom && r.geom AND ST_Intersects(c.geom, r.geom)
ORDER BY c.adcode;
实战验证:G4 京港澳高速贯穿北京、保定、石家庄、邢台、邯郸、安阳、鹤壁、新乡、郑州、许昌、漯河、驻马店、信阳、孝感、武汉、咸宁、岳阳、长沙、株洲、衡阳、郴州、韶关、清远、广州、东莞、深圳、香港等 27 个地级行政区 与 100+ 个区县。
三、常用国家级高速公路快速速查表
| 高速编号 | 全称 | 起止点 | OSM Relation ID (单向/主向) |
|---|---|---|---|
| G4 | 京港澳高速 | 北京 $\rightarrow$ 港澳 | 12902067, 12902068 |
| G2 | 京沪高速 | 北京 $\rightarrow$ 上海 | 12847443, 12847444 |
| G5 | 京昆高速 | 北京 $\rightarrow$ 昆明 | 15322579, 15322580 |
| G30 | 连霍高速 | 连云港 $\rightarrow$ 霍尔果斯 | 18360631, 18360632 |
| G42 | 沪蓉高速 | 上海 $\rightarrow$ 成都 | 15338443, 15338444 |
| G50 | 沪渝高速 | 上海 $\rightarrow$ 重庆 | 15338451, 15338452 |
| G6 | 京藏高速 | 北京 $\rightarrow$ 拉萨 | 15338435, 15338436 |
本项目提供了专用自动化提取脚本 scripts/export_expressway_geojson.py,支持传入高速编号(如 G4、G2)一键输出市县专题地图。