OSM和PBF数据格式说明

本文详细介绍了OpenStreetMap(OSM)的两种数据格式——OSM和PBF。OSM格式基于XML,包含节点、通道、关系和标签等元素。PBF是OSM的压缩格式,更小、更快,适用于大规模数据处理。内容涵盖了数据获取、清理、格式转换等方面,并详细解析了PBF的底层编码、文件格式和OSM实体的编码方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从openstreetmap上下载的数据都是*.osm后缀的,虽然后缀是osm,但它的格式其实是xml的,而pbf则是一种xml的压缩格式。

 

一、osm格式

复制于:http://wiki.citydatum.com/index.php/OpenStreetMap,这个网页对openstreetmap有一个整体介绍,包括openstreetmap的发展和现状等等,这里只摘抄跟数据格式有关的内容,并补充了点内容。

1.数据格式

OSM使用拓扑数据结构,包括四类核心要素(aka. data primitives):

Node(节点):地理位置点,以经纬度坐标形式存储,通常代表没有尺寸的要素,比如POI(Points Of Interest,兴趣点)或山峰的制高点;

Way(通道):一系列节点的列表,可以是多义线,当形成闭合路径时也可以是面;既可以代表线性要素,如街道、河流等,也可以代表面状要素,如森林、公园、停车场、湖泊等;

Relation(关系):节点、通道、关系的有序列表,合在一起叫做“member(成员)”,member可以有“role(地位)”属性(字符串格式);Relation用来表示已存在的节点和通道的相互关系,比如道路的转弯限制,高速公路跨越多条普通道路(并不相交),以及中间有洞的环形面等;

Tag(标签):关键值,键名、键值均为字符串格式,用于存储地图要素的元数据,比如类型、名称、物理属性等;标签是独立要素,但总是附着到地图要素(节点、通道、关系), 推荐的各类地图要素的标签定义及含义在一个wiki网站上进行维护(https://wiki.openstreetmap.org/wiki/Tags)。

OSM采用WGS 84(EPSG:4326)地理坐标系。

OSM原始数据格式为PBF、XML;PBF压缩率更高,更便于下载。

OSM数据很大程度上依赖于本地参与者的贡献,因而地图数据的质量在不同地区差异很大。

2.数据获取

OpenStreetMap官网:可以导出当前地图浏览范围涉及的数据,导出格式为OSM XML。

OSM星球:提供每周更新的完整OSM数据库副本,包括最新数据、历史数据(包括早期版本及已删除的数据),格式包括OSM XML、OSM PBF等,2017年9月最新XML数据库文件大小约为60G。

Geogfabrik:定期更新的洲、 国家和特定城市数据库,格式包括OSM XML、OSM PBF、ESRI Shape文件等(https://download.geofabrik.de/)。

Mapzen城市摘录:世界主要城市和周边地区的摘录,格式包括OSM XML、OSM PBF、ESRI Shape文件、GeoJSON等。

ArcGIS OSM编辑器:Arcmap的免费开源扩展插件,单次下载的地图范围有限,可通过切块下载解决,同时提供了一些编辑、分析工具。

QGIS:内置了OSM数据下载功能,点击菜单Vector ‣ OpenStreetMap ‣ Download data,输入需要下载的范围坐标即可,下载文件格式为OSM XML。

3.数据清理

图层拆分:OSM原始数据格式,仅区分点、线(面)等基本类型,数据使用前通常需要将不同类型的要素拆分成多个数据文件,如道路与河流,建筑物与水面等。

坐标转换:OSM数据采用地理坐标系,测量距离或与其他数据共同使用时,可能需要投影和转换坐标系。

4.格式转换

可利用多种工具,将OSM数据库转为其他格式的数据库:

 

OSM转PostgreSQL的工具:Osmosis、Osm2postgresql等;

利用Osmosis转换的基本流程:安装PostgreSQL、PostGIS、Osmosis;创建数据库,并创建Schema(模式);导入OSM数据至PostgreSQL数据库;

OSM转ArcGIS可用格式的工具:GeoConverter(网络应用)、 ArcGIS OSM编辑器等;

QGIS直接能打开*.osm文件,可以在QGIS中加载*.osm文件,右键图层,矢量图层另存为,将osm文件分别存储为shp、csv等。

 

5.总结

Osm文件也可以直接用文本文档打开,以读写xml数据的方式读写它,转成json、shp等。

 

二、PBF格式

PBF的难点在于它有压缩算法,稍微了解一下原理,真要读写PBF,还是用包吧,C++、java、python都有。

复制于:https://wiki.openstreetmap.org/wiki/Zh-hans:PBF_Format,这个页面也是我翻译的,翻译得很一般,有英语好的,可以改进一下。

PBF格式(Protocolbuffer Binary Format,协议缓存二进制格式),主要用于替代XML格式。它的大小约是gzip压缩的一半,比bzip压缩小30%。它的写入速度比gzip压缩快5倍,读取速度比gzip压缩快6倍。这种格式的设计是为了支持未来的可扩展性和灵活性。

这种基础文件格式被选择以支持在“文件块”粒度上的随机访问。每个文件块都是独立可解码的,并包含一系列已编码的原始组,每个原始组在默认配置中包含约8k的OSM实体。这里没有使用标签硬编码,所有键和值都以不透明字符串的形式完整存储。为了将来的可伸缩性,假设node/way/relation的id为64位。当前序列化器(Osmosis)保存了OSM实体和OSM实体上标签的顺序。为了灵活地处理多种分辨率,用于表示位置和时间戳的粒度或分辨率可以以1毫秒和1纳米度的倍数进行调整。默认的比例因子是1000毫秒和100纳米度,相当于赤道处约1厘米。这些也是OSM数据库的当前分辨率。

PBF文件的扩展名为*.osm.pbf。

目前,PBF的参考实现依赖Osmosis实现,分为两个部分,Osmosis专用部分,见https://github.com/openstreetmap/osmosis,以及应用通用部分,见https://github.com/openstreetmap/OSM-binary。应用程序通用部分用于构建osmpbf.jar(在osmosis和其他基于java的PBF阅读器中使用),还包含PBF协议缓存定义的主定义(*.proto文件)。

 

1、PBF的软件支持

除了原始的XML格式之外,OSM项目中使用的许多软件已经支持PBF,而且还有一些工具可以将PBF转换为OSM XML,反之亦然。

请参阅PBF/软件合规性(https://wiki.openstreetmap.org/wiki/PBF/Software_Compliance),了解各种程序对PBF文件支持的详细信息。

 

2、设计

2-1.底层编码

GPB格式(Google Protocol Buffers,谷歌协议缓存)用于底层存储。给定一个包含一条或多条消息的规范文件,协议缓存编译器编写底层序列化代码。消息可以包含其他消息,形成层次结构。协议缓存也支持可扩展性,可以将新字段添加到消息中,旧客户端无需重新编译就可以读取这些消息。欲了解更多细节,请参阅https://github.com/protocolbuffers/protobuf/或阅读谷歌开源博客上的相关文章(https://opensource.googleblog.com/2008/07/protocol-buffers-googles-data.html)。谷歌官方支持c++、Java和Python,也有针对其他语言的编译器。一个示例消息规范是:

message Node {

  required sint64 id = 1;

  // 并列数组

  repeated uint32 keys = 2 [packed = true]; // 字符串id

  repeated uint32 vals = 3 [packed = true]; // 字符串id

  optional Info info = 4; // 在omitmeta中可以省略

  required sint64 lat = 8;

  required sint64 lon = 9;

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值