从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;
}