FME大规模转换OSM PBF数据

PBF格式主要用于替代OSM原来的XML格式数据。它的大小约是gzip压缩的一半,比bzip压缩小30%。它的写入速度比gzip压缩快5倍,读取速度比gzip压缩快6倍。这种格式的设计是为了支持未来的可扩展性和灵活性1

通常下载PBF数据之后,我们只会需要其中部分数据,因为于原有的XML明码数据相比,PBF数据经过压缩,并没有那么好提取,我这里尝试使用FME来提取。

FME(Feature Manipulate Engine)是加拿大Safe Software公司开发的空间数据转换处理系统,它是完整的空间ETL解决方案。该方案基于OpenGIS组织提出的新的数据转换理念“语义转换”2。FME拥有超过400个不同功能的转换器,能够灵活应对各种数据重组和内容变换任务,并将处理后的信息输出到要求的格式中去,使信息在格式与应用之间自由迁移3

我这里使用的FME 2022 64位版本,经过我的测试,相比于2020版本,2022版对PBF的支持更稳定,转换更快。下面简单介绍一下转换步骤。

缓存目录设置

这一步是必须的,因为一个大洲的PBF数据通常是上10G,这还是高度压缩过的,解压之后会有好几十G甚至上百G,内存不太可能放得下,需要建立一个缓存目录存放这些临时数据。FME设置缓存目录只需要在环境变量中设置FME_TEMP就可以了,注意选定的文件夹所在盘剩余空间一定要足够大,20G的PBF文件出来的缓存文件会在100G左右。另外如果选定的文件夹所在的盘是固态盘,会提高转换速度。
环境变量设置

数据观察

这一步使用FME的数据浏览器 FME Data Inspector。这一步不需要观察我想提取的原数据,只需要找其中一块观察即可。比如我想提取亚洲的数据,但是亚洲的数据有10G以上,用FME Data Inspector打开要很久很久,单中国的数据1G多,打开也要很久。我们只选一个省份的数据就比较靠谱。如果我想提取交通数据,就可以选择观察长三角这种交通发达的地方比如浙江省的数据;如果我想提取水系数据,就可以选择观察江湖众多的地方比如湖北省的数据。我这里示例的是观察湖北省,提取机场数据。

观察需要有针对性,我这里提取机场,在打开数据时,可以只选择机场相关的数据。
打开数据
打开数据

这里需要注意,aeroway下面还可以展开选的,这个比较重要,需要反复确认自己想要的数据在哪一类。如果不知道,可以勾选大类,打开之后点击数据在属性部分看,这个以大类为属性名的属性值,就是展开后的小类,多查看一些,就知道自己需要的数据在哪些小类了。
数据查看

接下来就看自己需要的数据的属性,注意上图,他有两个地方可以查看要素的属性,一个是右侧展示属性有34个字段,一个是下侧的表视图,只有两个字段。默认情况下,如果用FME转换,她的读模块只会读取表视图里面的几条属性,这当然是非常不够的,因此需要自己观察右侧属性窗口里要素有哪些属性,哪些是需要的,记下来。这里要注意,就算是同一种要素,他拥有的属性字段也是不同的,毕竟OSM是众包的模式生产的数据,有的人填了,有的人没填,没填就没有,所以这里需要多看一些数据。

修改配置文件

上面说到,默认情况下,FME读取的OSM PBF数据字段是不够用的,我们需要打破这个默认。在FME打开PBF文件时,参数有这么一个选项,就是用来打破默认的。他默认的配置文件是[FME安装文件夹]\xml\osm\fme_map_features_config.xml,把他复制出来,然后修改。
读模块参数
比如我想提取aerodrome的国际航空运输协会机场代码,也就是iata,那我找到aeroway>aerodrome,然后在里面加入属性iata,再勾选上用户自定义的OSM Map要素,地图配置文件选择刚刚复制出来修改过的文件,就可以把这个属性暴露出来了。
自定义读取属性
最后把读模块设置成只暴露需要的属性,写模块设置自动属性,转换器就完成了(我这里输出格式选择的是Shapefile)。然后可以用小数据测试一下,看出来的是不是自己需要的数据。
读模块属性设置
写模块属性设置

其他技巧

  1. 经过我的测试,直接使用FME Workbench转换要比保存成.fmw文件之后使用FME Quick Translator调用稳定。
  2. 一次性转大数据,比如欧洲一整块20多个G,他的缓存文件会超过100个G,从这么大的缓存文件里筛选数据速度会慢到离谱,原不如分欧洲各国下数据然后选择多个文件批量转换来的快。
    多选批量转换

参考:

[1] PBF格式Wiki
[2] FME百度百科
[3] FME管网产品介绍
加载评论框需要翻墙