OSM 数据结构介绍 - ruierzhao/ruierzhao GitHub Wiki

OSM 数据结构介绍(如何在graphhopper中使用自己的适量数据自定义导航)

osm 数据的标签

主要就三类:node, way , relation

  • osm 数据本质就是只使用node节点存储点坐标数据,其他包括线和多边形由ref属性与点id属性对应组合出各种复杂的现实世界表达。元素的属性由tag标签动态表达(这样可以不要求所有元素拥有相同的属性字段)。
  • 其中relate标签是一种更加复杂的结构,用于表示节点和路径之间的关系。关系可以用于描述多个对象之间的复杂连接,例如公交路线和公交站点之间的关系(使用relate标签包含ndway来表示)。
  • 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>

osm 通用标签属性

  1. id

  2. version

    主要是用于方便 OSM 平台上数据的维护和版本控制)

    version是一个重要的属性,用于追踪每个地理元素(节点node、路径way、关系relation)的修改历史。version 的主要作用如下:

way标签的highway tag

在 OpenStreetMap (OSM) 数据中,highway 标签用于表示道路的类型和功能。它是一个非常重要的标签,帮助定义道路网络的结构和属性。更重要是的是:在使用graphhopper进行路径规划时必须包含此标签。 highway 标签的值有很多,下面是一些常见的值及其含义:

1. 主要道路类型

  • motorway:高速公路,是最高等级的道路,通常用于长途交通,设计速度较高,有专门的车道、中央隔离带等设施。
  • motorway_link:高速公路的连接道,用于连接高速公路和其他道路或出口。
  • trunk:主干道,主要用于连接城市之间的重要道路,通常承载大量交通流量,但设计和设施不如高速公路完善。
  • trunk_link:主干道的连接道,用于连接主干道和其他道路或出口。

2. 主要城市道路类型

  • primary:主干道,城市和地区之间的主要道路,通常宽度较大,承载较高的交通流量。
  • primary_link:主干道的连接道,用于连接主干道和其他道路或出口。
  • secondary:次要主干道,连接城市和地区的次要道路,承载的交通流量较少。
  • secondary_link:次要主干道的连接道,用于连接次要主干道和其他道路或出口。
  • tertiary:三级道路,通常用于城市内部或乡村地区,承载的交通流量更少。
  • tertiary_link:三级道路的连接道,用于连接三级道路和其他道路或出口。

3. 地方性道路

  • residential:住宅区道路,主要用于连接住宅区,通常设计速度较低,车流量相对较少。
  • service:服务道路,主要用于提供访问服务设施的道路,如停车场、工业区、商场等。
    • service 包含子类型,如:
      • service:parking_aisle:停车场车道,用于停车场内部的车道。
      • service:driveway:车道,用于连接住宅或商业建筑的车道。
      • service:alley:巷道,用于城市内部的狭窄道路。

4. 非机动车道路

  • cycleway:自行车道,专门为自行车设计的道路或车道。
  • footway:人行道,专门供行人使用的道路。
  • pedestrian:步行街道,完全不允许车辆通行,专供行人使用。

5. 特殊道路

  • track:乡村道路或小径,通常是非铺装的,用于连接乡村或远离主干道的区域。
  • path:步道或小径,通常用于步行、骑行等,车辆通行的可能性较小。
  • unclassified:未分类道路,通常是城市或乡村地区的普通道路,但未被明确分类为其他类型的道路。

6. 其他标记

  • living_street:生活街道,通常是设计用于低速行驶的街道,有助于提高行人的安全。
  • emergency_access:紧急服务通道,用于紧急服务车辆的专用通道。

这些 highway 标签值帮助描述道路的功能、等级和预期的使用方式。根据不同的道路类型,GraphHopper 和其他地图服务可以相应地处理道路数据,进行路径规划和导航。

relate中的membersrole

在 OpenStreetMap (OSM) 数据中,role 是用于描述关系(relation)成员的特定角色。role 通过定义每个成员在关系中的功能或位置,帮助明确地理元素之间的关系。不同类型的关系有不同的角色需求。以下是一些常见的 OSM role 示例:

1. 路线关系(Route Relations)

路线关系用于表示公共交通、徒步路径、骑行路线等。这些关系的成员可能包括路径(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>

2. 边界关系(Boundary Relations)

边界关系用于表示行政边界,如国家、州、省或城市的边界。这些关系通常由路径组成,角色定义每段边界的方向和功能。

  • 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>

3. 多边形关系(Multipolygon Relations)

多边形关系用于表示复杂的区域,如有内外环的湖泊或建筑物。成员的角色指定了哪些路径是多边形的外边界,哪些是内边界(洞)。

  • 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>

4. 建筑物轮廓和附属关系(Building Relations)

建筑物关系可以用于描述建筑物的复杂结构,包括主建筑和附属建筑或内部庭院。

  • 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>

5. 约束关系(Restriction Relations)

约束关系用于表示道路通行限制,例如禁止左转或右转。这些关系的成员包括 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>

6. 公共设施或区域关系(Site Relations)

这些关系用于表示校园、医院、购物中心等复杂场所,角色用于描述组成这些设施的各个部分。

  • 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 标签可以用来描述多种类型的桥梁结构。根据不同的桥梁形式和用途,常见的 bridge 类型标签包括以下几种:

1. bridge=yes

  • 说明: 最常用的标签,用于标识标准的桥梁,而不特别指定桥梁的具体类型。
  • 场景: 常见的公路桥、铁路桥等。

2. bridge=viaduct

  • 说明: 高架桥或高架道路,通常由一系列支撑结构(如拱形或柱形结构)组成,用于跨越低地、河谷或其他障碍。
  • 场景: 用于跨越大面积低洼地形的高速公路、铁路高架桥。

3. bridge=suspension

  • 说明: 悬索桥,桥面悬挂在两端的悬索或主缆上,靠索塔和拉索支撑。
  • 场景: 典型的悬索桥,如旧金山金门大桥。

4. bridge=cantilever

  • 说明: 悬臂桥,利用悬臂梁的结构来支撑桥面,通常中间没有支撑柱。
  • 场景: 用于跨越宽阔的河流或峡谷的桥梁,如魁北克桥。

5. bridge=arch

  • 说明: 拱桥,桥的主要结构是拱形,通过拱的弧度来分散桥上的荷载。
  • 场景: 常见于历史悠久的石拱桥或现代的混凝土拱桥。

6. bridge=beam

  • 说明: 梁桥,最常见的一种桥梁类型,由水平梁支撑桥面,梁的两端有桥墩或桥台支撑。
  • 场景: 高速公路或铁路上的简单跨河桥。

7. bridge=trestle

  • 说明: 栈桥,通常由一系列的框架或支柱支撑,用于穿越低地、河谷或水体。
  • 场景: 典型于铁路桥,尤其是在山区或森林地区。

8. bridge=truss

  • 说明: 桁架桥,使用桁架结构来支撑桥面,通常由金属或木质桁架构成。
  • 场景: 用于铁路和公路桥,特别是跨越大河流或山谷。

9. bridge=movable

  • 说明: 活动桥,指桥面可以移动或打开以允许船只通过的桥梁。
  • 场景: 包括升降桥、旋转桥或翻板桥。
  • 子类型:
    • bridge=lift: 升降桥。
    • bridge=swing: 旋转桥。
    • bridge=bascule: 翻板桥。

10. bridge=culvert

  • 说明: 涵洞桥,通常是较小的结构,允许水流、动物或小型交通工具通过桥下。
  • 场景: 通常用于公路或铁路下方,用于排水或允许溪流通过。

11. bridge=aqueduct

  • 说明: 水桥,专门用于承载水流的桥梁,类似于运河桥或高架输水管道。
  • 场景: 用于输水工程,如跨越河流或山谷的运河桥。

12. bridge=footbridge

  • 说明: 人行桥,专门用于行人通行的小型桥梁。
  • 场景: 公园内的步行桥、城市中的人行天桥。

13. bridge=boardwalk

  • 说明: 栈道桥,用木板或其他轻质材料建造的栈道式桥梁。
  • 场景: 通常用于步行道、穿越湿地或沙滩的通道。

14. bridge=covered

  • 说明: 廊桥,桥面有屋顶覆盖的桥梁。
  • 场景: 历史悠久的木桥,通常在乡村或山地。

15. bridge=tunnel

  • 说明: 这是一个特例,用于某些特殊情况下,桥的某一部分在地面下方(可能是桥下穿过的路是开放的)。
  • 场景: 比较少见,通常在复杂的多层交通网络中。

16. bridge=abutment

  • 说明: 桥台,连接桥梁和地面的结构。
  • 场景: 表示桥梁两端的固定结构,用来支撑桥体。

数据转换

在使用graphhopper 进行路径规划时,默认只能使用osm网站下载到的标准数据。 如何在graphhopper中使用常见的shp类型的数据或者geojson数据呢。

1. 想办法把 shp 数据转换为 osm 数据。

有三种方式:

    1. 使用JOSM安装插件加载shp文件,再导出osm格式数据。
    1. 使用ogr2osm工具,具体使用看官方介绍, 推荐使用docker部署。示例:
    ogr2osm input.geojson -o output.osm
    1. 使用 qgis 附带的ogr2ogr工具,具体看这里。示例:
    ogr2ogr \
      -of "OSM" \ # 输出格式
      -if "ESRI Shapefile" \# 输入格式
      output.osm \ # 输出文件
      input.shp  # 输入文件
    1. 使用 qgis 附带的ogr2ogr工具,具体看这里。示例:
    ogr2ogr \
      -of "OSM" \ # 输出格式
      -if "ESRI Shapefile" \# 输入格式
      output.osm \ # 输出文件
      input.shp  # 输入文件

2. 如何在graphhopper中使用自定义的数据

    1. 使用任意编辑器打开osm,手动修改way标签的tag(添加 highway 属性),具体值在上面介绍过。示例:
    <way>
      <nd ref="..."/ >
      ...
      <nd ref="..."/ >
      <tag k='highway' v='secondary' />
    </way>
    1. 对于数据量比较大的情况手动改有点太麻烦了,就可以使用JOSM软件批量操作,具体看这里如下图操作: patch-add-label
    1. 改完的数据就可以在graphhopper中进行离线导航了。需要转为pbf格式的数据也可以使用JOSM导出,也可以使用osmosis工具进行转换。
⚠️ **GitHub.com Fallback** ⚠️