OSM 数据结构介绍 - ruierzhao/ruierzhao GitHub Wiki
主要就三类:node
, way
, relation
。
- osm 数据本质就是只使用
node
节点存储点坐标数据,其他包括线和多边形由ref
属性与点id
属性对应组合出各种复杂的现实世界表达。元素的属性由tag
标签动态表达(这样可以不要求所有元素拥有相同的属性字段)。 - 其中
relate
标签是一种更加复杂的结构,用于表示节点和路径之间的关系。关系可以用于描述多个对象之间的复杂连接,例如公交路线和公交站点之间的关系(使用relate
标签包含nd
和way
来表示)。 - pbf 数据只是 osm 数据的压缩版本,理解 osm 数据就行。
<node id="1" lat="50.01" lon="10.003" />
<node id="2" lat="50.03" lon="10.027" />
<way id="3">
<nd ref="1"/>
<nd ref="2"/>
<tag k="highway" v="residential"/>
</way>
<relation id="4">
<member type="way" ref="2" role="outer"/>
<tag k="type" v="multipolygon"/>
</relation>
-
id
-
version
主要是用于方便 OSM 平台上数据的维护和版本控制)
version
是一个重要的属性,用于追踪每个地理元素(节点node
、路径way
、关系relation
)的修改历史。version
的主要作用如下:
在 OpenStreetMap (OSM) 数据中,highway
标签用于表示道路的类型和功能。它是一个非常重要的标签,帮助定义道路网络的结构和属性。更重要是的是:在使用graphhopper
进行路径规划时必须包含此标签。 highway
标签的值有很多,下面是一些常见的值及其含义:
-
motorway
:高速公路,是最高等级的道路,通常用于长途交通,设计速度较高,有专门的车道、中央隔离带等设施。 -
motorway_link
:高速公路的连接道,用于连接高速公路和其他道路或出口。 -
trunk
:主干道,主要用于连接城市之间的重要道路,通常承载大量交通流量,但设计和设施不如高速公路完善。 -
trunk_link
:主干道的连接道,用于连接主干道和其他道路或出口。
-
primary
:主干道,城市和地区之间的主要道路,通常宽度较大,承载较高的交通流量。 -
primary_link
:主干道的连接道,用于连接主干道和其他道路或出口。 -
secondary
:次要主干道,连接城市和地区的次要道路,承载的交通流量较少。 -
secondary_link
:次要主干道的连接道,用于连接次要主干道和其他道路或出口。 -
tertiary
:三级道路,通常用于城市内部或乡村地区,承载的交通流量更少。 -
tertiary_link
:三级道路的连接道,用于连接三级道路和其他道路或出口。
-
residential
:住宅区道路,主要用于连接住宅区,通常设计速度较低,车流量相对较少。 -
service
:服务道路,主要用于提供访问服务设施的道路,如停车场、工业区、商场等。-
service
包含子类型,如:-
service:parking_aisle
:停车场车道,用于停车场内部的车道。 -
service:driveway
:车道,用于连接住宅或商业建筑的车道。 -
service:alley
:巷道,用于城市内部的狭窄道路。
-
-
-
cycleway
:自行车道,专门为自行车设计的道路或车道。 -
footway
:人行道,专门供行人使用的道路。 -
pedestrian
:步行街道,完全不允许车辆通行,专供行人使用。
-
track
:乡村道路或小径,通常是非铺装的,用于连接乡村或远离主干道的区域。 -
path
:步道或小径,通常用于步行、骑行等,车辆通行的可能性较小。 -
unclassified
:未分类道路,通常是城市或乡村地区的普通道路,但未被明确分类为其他类型的道路。
-
living_street
:生活街道,通常是设计用于低速行驶的街道,有助于提高行人的安全。 -
emergency_access
:紧急服务通道,用于紧急服务车辆的专用通道。
这些 highway
标签值帮助描述道路的功能、等级和预期的使用方式。根据不同的道路类型,GraphHopper 和其他地图服务可以相应地处理道路数据,进行路径规划和导航。
在 OpenStreetMap (OSM) 数据中,role
是用于描述关系(relation)成员的特定角色。role
通过定义每个成员在关系中的功能或位置,帮助明确地理元素之间的关系。不同类型的关系有不同的角色需求。以下是一些常见的 OSM role
示例:
路线关系用于表示公共交通、徒步路径、骑行路线等。这些关系的成员可能包括路径(ways)和节点(nodes),角色用于描述每个成员在路线中的具体作用。
-
stop
:表示公交或列车停靠站。 -
platform
:表示乘客等待的站台区域。 -
forward
/backward
:用于方向性路线,表示路径的前进方向或返回方向。 -
via
:表示路线经过的关键节点,如道路交叉口。
示例:
<relation id="12345">
<member type="way" ref="67890" role="forward"/>
<member type="node" ref="23456" role="stop"/>
<member type="way" ref="34567" role="platform"/>
<tag k="type" v="route"/>
<tag k="route" v="bus"/>
</relation>
边界关系用于表示行政边界,如国家、州、省或城市的边界。这些关系通常由路径组成,角色定义每段边界的方向和功能。
-
outer
:表示边界的外圈(外部路径)。 -
inner
:表示边界内部的洞或排除区域(内部路径)。
示例:
<relation id="67890">
<member type="way" ref="34567" role="outer"/>
<member type="way" ref="45678" role="inner"/>
<tag k="type" v="boundary"/>
<tag k="boundary" v="administrative"/>
</relation>
多边形关系用于表示复杂的区域,如有内外环的湖泊或建筑物。成员的角色指定了哪些路径是多边形的外边界,哪些是内边界(洞)。
-
outer
:表示多边形的外边界。 -
inner
:表示多边形内部的洞。
示例:
<relation id="78901">
<member type="way" ref="12345" role="outer"/>
<member type="way" ref="67890" role="inner"/>
<tag k="type" v="multipolygon"/>
</relation>
建筑物关系可以用于描述建筑物的复杂结构,包括主建筑和附属建筑或内部庭院。
-
main
:表示主要建筑结构。 -
part
:表示附属结构或建筑部分。 -
courtyard
:表示建筑内部的庭院。
示例:
<relation id="89012">
<member type="way" ref="23456" role="main"/>
<member type="way" ref="34567" role="part"/>
<tag k="type" v="building"/>
</relation>
约束关系用于表示道路通行限制,例如禁止左转或右转。这些关系的成员包括 from
(起始道路)、to
(目标道路)和 via
(中间节点)。
-
from
:表示约束开始的路径。 -
to
:表示约束结束的路径。 -
via
:表示约束经过的节点或路径。
示例:
<relation id="90123">
<member type="way" ref="56789" role="from"/>
<member type="way" ref="67890" role="to"/>
<member type="node" ref="23456" role="via"/>
<tag k="type" v="restriction"/>
<tag k="restriction" v="no_left_turn"/>
</relation>
这些关系用于表示校园、医院、购物中心等复杂场所,角色用于描述组成这些设施的各个部分。
-
building
:表示主要建筑物。 -
parking
:表示停车区域。 -
garden
:表示花园或绿地。 -
entrance
:表示入口点。
示例:
<relation id="45678">
<member type="way" ref="67890" role="building"/>
<member type="way" ref="78901" role="parking"/>
<member type="node" ref="34567" role="entrance"/>
<tag k="type" v="site"/>
<tag k="site" v="school"/>
</relation>
- 说明: 最常用的标签,用于标识标准的桥梁,而不特别指定桥梁的具体类型。
- 场景: 常见的公路桥、铁路桥等。
- 说明: 高架桥或高架道路,通常由一系列支撑结构(如拱形或柱形结构)组成,用于跨越低地、河谷或其他障碍。
- 场景: 用于跨越大面积低洼地形的高速公路、铁路高架桥。
- 说明: 悬索桥,桥面悬挂在两端的悬索或主缆上,靠索塔和拉索支撑。
- 场景: 典型的悬索桥,如旧金山金门大桥。
- 说明: 悬臂桥,利用悬臂梁的结构来支撑桥面,通常中间没有支撑柱。
- 场景: 用于跨越宽阔的河流或峡谷的桥梁,如魁北克桥。
- 说明: 拱桥,桥的主要结构是拱形,通过拱的弧度来分散桥上的荷载。
- 场景: 常见于历史悠久的石拱桥或现代的混凝土拱桥。
- 说明: 梁桥,最常见的一种桥梁类型,由水平梁支撑桥面,梁的两端有桥墩或桥台支撑。
- 场景: 高速公路或铁路上的简单跨河桥。
- 说明: 栈桥,通常由一系列的框架或支柱支撑,用于穿越低地、河谷或水体。
- 场景: 典型于铁路桥,尤其是在山区或森林地区。
- 说明: 桁架桥,使用桁架结构来支撑桥面,通常由金属或木质桁架构成。
- 场景: 用于铁路和公路桥,特别是跨越大河流或山谷。
- 说明: 活动桥,指桥面可以移动或打开以允许船只通过的桥梁。
- 场景: 包括升降桥、旋转桥或翻板桥。
-
子类型:
-
bridge=lift
: 升降桥。 -
bridge=swing
: 旋转桥。 -
bridge=bascule
: 翻板桥。
-
- 说明: 涵洞桥,通常是较小的结构,允许水流、动物或小型交通工具通过桥下。
- 场景: 通常用于公路或铁路下方,用于排水或允许溪流通过。
- 说明: 水桥,专门用于承载水流的桥梁,类似于运河桥或高架输水管道。
- 场景: 用于输水工程,如跨越河流或山谷的运河桥。
- 说明: 人行桥,专门用于行人通行的小型桥梁。
- 场景: 公园内的步行桥、城市中的人行天桥。
- 说明: 栈道桥,用木板或其他轻质材料建造的栈道式桥梁。
- 场景: 通常用于步行道、穿越湿地或沙滩的通道。
- 说明: 廊桥,桥面有屋顶覆盖的桥梁。
- 场景: 历史悠久的木桥,通常在乡村或山地。
- 说明: 这是一个特例,用于某些特殊情况下,桥的某一部分在地面下方(可能是桥下穿过的路是开放的)。
- 场景: 比较少见,通常在复杂的多层交通网络中。
- 说明: 桥台,连接桥梁和地面的结构。
- 场景: 表示桥梁两端的固定结构,用来支撑桥体。
在使用graphhopper
进行路径规划时,默认只能使用osm
网站下载到的标准数据。
如何在graphhopper
中使用常见的shp
类型的数据或者geojson
数据呢。
有三种方式:
-
- 使用
JOSM
安装插件加载shp
文件,再导出osm
格式数据。
- 使用
-
- 使用
ogr2osm
工具,具体使用看官方介绍, 推荐使用docker
部署。示例:
ogr2osm input.geojson -o output.osm
- 使用
-
- 使用 qgis 附带的
ogr2ogr
工具,具体看这里。示例:
ogr2ogr \ -of "OSM" \ # 输出格式 -if "ESRI Shapefile" \# 输入格式 output.osm \ # 输出文件 input.shp # 输入文件
- 使用 qgis 附带的
-
ogr2ogr \ -of "OSM" \ # 输出格式 -if "ESRI Shapefile" \# 输入格式 output.osm \ # 输出文件 input.shp # 输入文件