我使用Osmosis将osm.pbf文件导入到我的java应用程序中,如下所示:
data class MapObject (
val lat: Double,
val lon: Double,
val id: Long
)
class OsmReader : Sink {
val data = mutableListOf<MapObject>()
override fun close() {}
override fun complete() {}
override fun initialize(metaData: MutableMap<String, Any>?) {}
override fun process(entityContainer: EntityContainer?) {
if (entityContainer is NodeContainer) {
val node = entityContainer.entity
data.add( MapObject(node.latitude, node.longitude, node.id) )
}
}
}
fun readOSM(pathToPBF: String) {
val inputStream = FileInputStream(pathToPBF)
// read from osm pbf file:
val custom = OsmReader()
val reader = OsmosisReader(inputStream)
reader.setSink(custom)
// initial parsing of the .pbf file:
reader.run()
println("Break")
}
我想只读取给定边界框中的节点。然后在命令行中使用Osmosis,你可以使用--bounding-box,但是在代码中如何做同样的事情呢?
目前,我使用JTS将每个节点与边界框相交,但这相当慢。
2条答案
按热度按时间unhi4e5o1#
我试着使用Jacopo的回答中描述的管道,对我来说,管道的构造方式使它无法过滤给定的pbf文件。
对我有用的是下面这段代码。
关于此管道工作方式的一些额外信息。
当运行OsmosisReader时,它在给定的接收器中运行process方法,在这种情况下是boundingboxfilter,boundingboxfilter然后过滤给定的数据并从给定的接收器中调用process方法,在这种情况下是customprocessor,这样只有边界框内的项才会到达CustomProcessor。
希望这个答案可以帮助其他人寻找如何使用渗透的boundingboxfilter的信息。
slsn1g292#
我现在找到了答案:
下面是一个示例,说明如何获取特定bouding框中的所有商店,并将它们存储在列表中的节点、路径和关系的列表中。
我使用kotlin与gradle。
在gradle.kts中:
代码:
如果你想要的方式和关系的几何,你还需要存储它们组成的节点。这些都没有贴上“商店”的标签。将它们存储在列表中会占用大量的RAM,因此最好使用org.openstreetmap.osmosis. core.store.SimpleObjectStore类。