在 osmchina 数据库中检索中国高速公路网的实战指南

中国国家高速公路网(National Trunk Highway System / 71118网,如 G4 京港澳高速、G2 京沪高速、G30 连霍高速、G42 沪蓉高速等)是全国客货物流的大动脉。

在 OpenStreetMap 中,高速公路的数据建模与普通道路有较大差异。本文系统总结在本地 osmchina(33GB)数据库中,如何高效查询高速公路全网、处理双向分离车道,以及生成沿线行政区空间图层的技术方案。


一、中国高速在 OSM 中的数据组织特点

高速公路通常全封闭、立交化,其在 OSM 中的组织方式主要有三个鲜明特征:

  1. highway = 'motorway' 物理标签:
    • 所有的主干车道均标记为 motorway,进出匝道标记为 motorway_link。
    • planet_osm_roads 表专为大尺度地图优化,预先保留了所有的 motorway,因此做纯线形预览时可直接查询 planet_osm_roads。
  2. 方向分离的双关系组织(Dual-Direction Routes):
    • 因为高速公路上下行完全隔离且互通匝道不同,OSM 通常将国家高速拆分为两个反向关系。
    • 例如 G4 京港澳高速:
      • 12902067:京港澳高速(北京方向,2,205 ways)
      • 12902068:京港澳高速(港澳方向,2,223 ways)
    • 实战注意:在提取整条国家高速时,应将双向关系合并聚拢,或者选取任一主方向作为轴线。
  3. 编号规则规范(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)一键输出市县专题地图。