高精路网:通用性数据结构设计
本文提出了一套高精路网数据库设计方案,基于PostgreSQL+PostGIS实现,重点支持车道级高精度几何信息存储和拓扑关系管理。方案采用动静分离策略,将静态属性(道路/车道基础信息)与动态状态(实时路况)分开存储,并建立了道路、车道、节点、转向关系等核心表结构。其中lane_info表存储厘米级精度的车道几何数据,road_dynamic表支持高频更新。设计强调空间索引优化,推荐使用GEOME
一、高精路网数据设计概述
1、基础说明
高精路网数据的数据库表设计需要满足高精度几何信息存储、拓扑关系管理、多维度属性支撑(如车道级细节、交通规则、动态状态等),同时兼顾查询性能(如空间索引、分区策略)。以下是一套通用且可扩展的高精路网数据库表设计方案,基于 PostgreSQL + PostGIS(空间扩展)实现(主流空间数据库选型,支持高精度几何类型和空间索引)。如果还需要管理其他结构道路信息,需要在此基础上做扩展。
2、核心设计原则
- 拓扑分离:道路、车道、路口等核心要素独立成表,通过关联字段维护拓扑关系;
- 高精度支持:使用 PostGIS 的 GEOMETRY 类型(如 LINESTRINGZ 存储 3D 坐标、POINTZ 存储节点),坐标系推荐 EPSG:4326(WGS84)或 EPSG:3857(Web 墨卡托),根据实际场景选择;
- 属性分层:静态属性(如道路等级、车道数)、动态属性(如拥堵状态、临时管制)分离存储,提升更新效率;
- 索引优化:空间索引(GIST)、业务字段索引(如道路 ID、车道 ID)全覆盖,支持快速空间查询和关联查询。
二、数据结构基础信
1、道路基础信息表(road_base)
存储道路整体的静态基础属性,不包含车道级细节,是路网的顶层要素。
|
字段名 |
数据类型 |
约束 |
说明 |
|
road_id |
VARCHAR(64) |
PRIMARY KEY |
道路唯一标识(建议采用 UUID 或业务编码,如“RD-XXX-XXX”) |
|
road_name |
VARCHAR(128) |
NOT NULL |
道路名称(如 “北京三环东路”) |
|
road_type |
SMALLINT |
NOT NULL |
道路类型:1 = 高速路,2 = 快速路,3 = 主干道,4 = 次干道,5 = 支路,6 = 小区道路 |
|
road_grade |
SMALLINT |
NOT NULL |
道路等级:1 = 国家级,2 = 省级,3 = 市级,4 = 区级,5 = 乡级 |
|
direction |
SMALLINT |
NOT NULL |
通行方向:1 = 双向,2 = 单向(东→西),3 = 单向(西→东),4 = 单向(南→北),5 = 单向(北→南) |
|
length |
DOUBLE PRECISION |
NOT NULL |
道路总长度(单位:米,与几何字段计算一致) |
|
speed_limit |
INTEGER |
NOT NULL |
最高限速(单位:km/h) |
|
start_node_id |
VARCHAR(64) |
FOREIGN KEY |
道路起点节点 ID(关联 road_node.node_id) |
|
end_node_id |
VARCHAR(64) |
FOREIGN KEY |
道路终点节点 ID(关联 road_node.node_id) |
|
geometry |
GEOMETRY(LINESTRINGZ, 4326) |
NOT NULL |
道路中心线几何(3D:X = 经度,Y = 纬度,Z = 高程) |
|
status |
SMALLINT |
DEFAULT 1 |
道路状态:1 = 正常,2 = 施工,3 = 封闭,4 = 废弃 |
|
create_time |
TIMESTAMP |
DEFAULT NOW() |
创建时间 |
|
update_time |
TIMESTAMP |
DEFAULT NOW() |
更新时间 |
2、道路节点表(road_node)
存储道路的关键节点(如路口中心点、道路起止点、变道节点),是拓扑关系的核心支撑。
|
字段名 |
数据类型 |
约束 |
说明 |
|
node_id |
VARCHAR(64) |
PRIMARY KEY |
节点唯一标识(UUID 或 “NODE-XXX-XXX”) |
|
node_type |
SMALLINT |
NOT NULL |
节点类型:1 = 路口节点,2 = 道路起止节点,3 = 变道节点,4 = 出入口节点 |
|
geometry |
GEOMETRY(POINTZ, 4326) |
NOT NULL |
节点坐标(3D:X = 经度,Y = 纬度,Z = 高程) |
|
link_road_ids |
VARCHAR(1024) |
关联道路 ID 列表(逗号分隔,如 “RD-1,RD-2”,表示该节点连接的道路) |
|
|
is_traffic_light |
BOOLEAN |
DEFAULT FALSE |
是否有交通信号灯:TRUE = 有,FALSE = 无 |
|
traffic_light_id |
VARCHAR(64) |
FOREIGN KEY |
交通信号灯 ID(关联 traffic_light.traffic_light_id,无则为 NULL) |
|
create_time |
TIMESTAMP |
DEFAULT NOW() |
创建时间 |
|
update_time |
TIMESTAMP |
DEFAULT NOW() |
更新时间 |
3、车道信息表(lane_info)
高精路网核心表,存储车道级细节(高精度几何、车道属性、拓扑关系),是自动驾驶路径规划的核心依赖。
|
字段名 |
数据类型 |
约束 |
说明 |
|
lane_id |
VARCHAR(64) |
PRIMARY KEY |
车道唯一标识(UUID 或 “LANE-XXX-XXX”) |
|
road_id |
VARCHAR(64) |
FOREIGN KEY |
所属道路 ID(关联 road_base.road_id) |
|
lane_num |
SMALLINT |
NOT NULL |
车道序号(同一道路内的车道编号,如 1 = 最左侧车道,2 = 左侧第二车道) |
|
lane_type |
SMALLINT |
NOT NULL |
车道类型:1 = 直行车道,2 = 左转车道,3 = 右转车道,4 = 左转 + 直行车道,5 = 公交专用道,6 = 应急车道 |
|
direction |
SMALLINT |
NOT NULL |
车道通行方向(与道路方向一致,参考 road_base.direction) |
|
width |
DOUBLE PRECISION |
NOT NULL |
车道宽度(单位:米,高精度要求保留 2 位小数) |
|
length |
DOUBLE PRECISION |
NOT NULL |
车道长度(单位:米,与几何字段一致) |
|
speed_limit |
INTEGER |
车道限速(优先级高于道路限速,无则继承道路限速) |
|
|
start_node_id |
VARCHAR(64) |
FOREIGN KEY |
车道起点节点 ID(关联 road_node.node_id) |
|
end_node_id |
VARCHAR(64) |
FOREIGN KEY |
车道终点节点 ID(关联 road_node.node_id) |
|
left_lane_id |
VARCHAR(64) |
FOREIGN KEY |
左侧相邻车道 ID(无则为 NULL) |
|
right_lane_id |
VARCHAR(64) |
FOREIGN KEY |
右侧相邻车道 ID(无则为 NULL) |
|
allow_change_left |
BOOLEAN |
DEFAULT TRUE |
是否允许向左变道:TRUE = 允许,FALSE = 禁止 |
|
allow_change_right |
BOOLEAN |
DEFAULT TRUE |
是否允许向右变道:TRUE = 允许,FALSE = 禁止 |
|
geometry |
GEOMETRY(LINESTRINGZ, 4326) |
NOT NULL |
车道中心线几何(3D,精度要求达厘米级) |
|
lane_edge_left |
GEOMETRY(LINESTRINGZ, 4326) |
NOT NULL |
车道左侧边缘线几何(3D) |
|
lane_edge_right |
GEOMETRY(LINESTRINGZ, 4326) |
NOT NULL |
车道右侧边缘线几何(3D) |
|
status |
SMALLINT |
DEFAULT 1 |
车道状态:1 = 正常,2 = 施工占用,3 = 封闭,4 = 临时管制 |
|
create_time |
TIMESTAMP |
DEFAULT NOW() |
创建时间 |
|
update_time |
TIMESTAMP |
DEFAULT NOW() |
更新时间 |
4、路口转向关系表(intersection_link)
维护路口内车道的转向逻辑(如 “车道 A→路口→车道 B”)。
|
字段名 |
数据类型 |
约束 |
说明 |
|
link_id |
VARCHAR(64) |
PRIMARY KEY |
转向关系 ID(如 LINK-001) |
|
intersection_node_id |
VARCHAR(64) |
FOREIGN KEY |
路口节点 ID(关联 road_node.node_id,且 node_type=1) |
|
in_lane_id |
VARCHAR(64) |
FOREIGN KEY |
驶入车道 ID(进入路口的车道) |
|
out_lane_id |
VARCHAR(64) |
FOREIGN KEY |
驶出车道 ID(离开路口的车道) |
|
turn_type |
SMALLINT |
NOT NULL |
转向类型:1 = 直行,2 = 左转,3 = 右转,4 = 掉头 |
|
is_allowed |
BOOLEAN |
DEFAULT TRUE |
是否允许该转向(如禁止左转则为 FALSE) |
|
turn_speed_limit |
INTEGER |
DEFAULT 30 |
转向限速(km/h) |
|
create_time |
TIMESTAMP |
DEFAULT NOW() |
创建时间 |
|
update_time |
TIMESTAMP |
DEFAULT NOW() |
更新时间 |
5、路网动态状态表(road_dynamic)
存储道路 / 车道的动态属性(高频更新,与静态表分离)。
|
字段名 |
数据类型 |
约束 |
说明 |
|
dynamic_id |
BIGSERIAL |
PRIMARY KEY |
自增主键 |
|
target_id |
VARCHAR(64) |
NOT NULL |
目标ID(road_id 或 lane_id) |
|
target_type |
SMALLINT |
NOT NULL |
目标类型:1 = 道路,2 = 车道 |
|
congestion_level |
SMALLINT |
DEFAULT 1 |
拥堵等级:1 = 畅通,2 = 缓行,3 = 拥堵,4 = 严重拥堵 |
|
real_time_speed |
INTEGER |
实时车速(km/h) |
|
|
temporary_control |
BOOLEAN |
DEFAULT FALSE |
是否临时管制 |
|
control_reason |
VARCHAR(256) |
管制原因(如 “交通事故”“临时施工”) |
|
|
update_time |
TIMESTAMP |
DEFAULT NOW() |
数据更新时间(建议 30 秒~5 分钟更新一次) |
6、交通设施表(traffic_facility)
存储交通灯、标志、标线等附属设施。
|
字段名 |
数据类型 |
约束 |
说明 |
|
facility_id |
VARCHAR(64) |
PRIMARY KEY |
设施 ID(如 FAC-001) |
|
facility_type |
SMALLINT |
NOT NULL |
设施类型:1 = 交通灯,2 = 禁止标志,3 = 警告标志,4 = 指示标志,5 = 标线 |
|
geometry |
GEOMETRY(POINTZ/LINESTRINGZ, 4326) |
NOT NULL |
设施位置(点 / 线,3D) |
|
associated_id |
VARCHAR(64) |
NOT NULL |
关联对象 ID(节点 / 车道 / 道路) |
|
associated_type |
SMALLINT |
NOT NULL |
关联类型:1 = 节点,2 = 车道,3 = 道路 |
|
content |
VARCHAR(128) |
设施内容(如 “限速 60”“禁止左转”) |
|
|
status |
SMALLINT |
DEFAULT 1 |
状态:1 = 正常,2 = 故障,3 = 拆除 |
|
create_time |
TIMESTAMP |
DEFAULT NOW() |
创建时间 |
|
update_time |
TIMESTAMP |
DEFAULT NOW() |
更新时间 |
三、总结说明
- 高精路网表设计核心是车道级高精度几何存储+拓扑关系闭环,lane_info是核心表,需重点优化空间索引;
- 采用 “动静分离” 策略,静态表(road_base/lane_info)稳定存储,动态表(road_dynamic)高频更新,兼顾性能和数据新鲜度;
- 基于 PostGIS 的空间索引是提升 “附近道路 / 车道查询”“路径规划” 等核心操作性能的关键,必须优先创建。
更多推荐
所有评论(0)