使用OSMOSIS提取OpenStreetMap数据时出现类缺失报错如何解决?
问题描述
我正在尝试复现OSM教程中的osmosis示例,已经下载了对应示例数据,运行如下命令:
osmosis --rbf sample_osmosis.osm.pbf --nkv keyValueList="amenity.school" --wx schools.osm
我使用的系统是Linux Mint 20.2 Cinnamon,通过新立得软件包管理器安装了0.47版本的osmosis。我已经将示例数据下载到本地,在pbf文件所在目录运行上述命令后,收到如下报错:
osmosis --rbf sample_osmosis.osm.pbf --nkv keyValueList="amenity.school" --wx schools.osm nov. 18, 2021 11:55:56 P. M. org.openstreetmap.osmosis.core.Osmosis run INFORMACIÓN: Osmosis Version 0.47 nov. 18, 2021 11:55:56 P. M. org.openstreetmap.osmosis.core.Osmosis run INFORMACIÓN: Preparing pipeline. nov. 18, 2021 11:55:56 P. M. org.openstreetmap.osmosis.core.Osmosis run INFORMACIÓN: Launching pipeline execution. nov. 18, 2021 11:55:56 P. M. org.openstreetmap.osmosis.core.Osmosis run INFORMACIÓN: Pipeline executing, waiting for completion. nov. 18, 2021 11:55:56 P. M. org.openstreetmap.osmosis.core.pipeline.common.ActiveTaskManager waitForCompletion GRAVE: Thread for task 1-rbf failed java.lang.NoClassDefFoundError: com/google/common/util/concurrent/MoreExecutors at org.openstreetmap.osmosis.pbf2.v0_6.PbfReader.run(PbfReader.java:87) at java.base/java.lang.Thread.run(Thread.java:829) Caused by: java.lang.ClassNotFoundException: com.google.common.util.concurrent.MoreExecutors at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50) at org.codehaus.plexus.classworlds.realm.ClassRealm.unsynchronizedLoadClass(ClassRealm.java:271) at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:247) at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:239) ... 2 more nov. 18, 2021 11:55:56 P. M. org.openstreetmap.osmosis.core.Osmosis main GRAVE: Execution aborted. org.openstreetmap.osmosis.core.OsmosisRuntimeException: One or more tasks failed. at org.openstreetmap.osmosis.core.pipeline.common.Pipeline.waitForCompletion(Pipeline.java:146) at org.openstreetmap.osmosis.core.Osmosis.run(Osmosis.java:92) at org.openstreetmap.osmosis.core.Osmosis.main(Osmosis.java:37) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.codehaus.plexus.classworlds.launcher.Launcher.launchStandard(Launcher.java:321) at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:234) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:406) at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:347) at org.codehaus.classworlds.Launcher.main(Launcher.java:47)
请问是什么原因导致该问题,该如何解决?
问题原因
你通过系统软件源安装的0.47版本osmosis存在打包缺陷,缺少运行必需的Google Guava工具库依赖,无法正常加载PBF文件读取所需的类,是Ubuntu系列发行版(Linux Mint基于Ubuntu开发)该版本osmosis包的已知问题。
可行解决方案
- 方案一:补全依赖修复现有安装
- 先安装缺失的guava库:
sudo apt install libguava-java- 编辑osmosis启动脚本,将guava库加入类路径。打开
/usr/bin/osmosis文件,找到CLASSPATH相关配置行,追加:/usr/share/java/guava.jar后保存即可。
- 方案二:使用官方预编译版本
- 先卸载现有有问题的版本:
sudo apt remove --purge osmosis- 下载osmosis官方预编译包(所有依赖已内置),解压后将解压目录下的bin文件夹路径加入系统环境变量,即可正常使用。
- 方案三:换用更轻量的osmctools工具实现相同需求
如果你只需要完成简单的OSM数据筛选,可使用功能匹配、运行速度更快的osmfilter工具替代:- 安装工具包:
sudo apt install osmctools- 执行筛选命令:
osmconvert sample_osmosis.osm.pbf --out-o5m | osmfilter --keep="amenity=school" --out-osm > schools.osm
内容的提问来源于stack exchange,提问作者antecessor
相关产品推荐
相关产品推荐

