在 docker 容器中加载 openstreetmap .osm 的最佳方式
The best way to load an openstreetmap .osm in a docker-container
我的意图:
其实我打算:
- 将车辆作为容器实施
- simulate/move 基于 .osm 地图的道路上的这些容器
我对问题的看法:
我已经加载 XML-based
.osm
文件并使用 xml.dom
在 python 中处理它。但我对加载 .osm
文件的性能不满意,因为稍后,我将不得不 add/create 更多车辆作为集装箱模拟到同一条道路上。
需要的建议:
这是我第一次解决与地图相关的问题。事实上,我需要关于如何通过牢记 performance/efficiency 这组要求来进行的建议。在实施方面的建议将不胜感激。提前致谢!
我想通过 运行 大量 docker 容器并行模拟大量车辆可能可行。也许你正在初始化具有不同起始位置等的相同图像作为 ENV 变量传入?作为进行代理模拟的实用方法,这对我来说听起来有点 over-engineered,但作为一个有趣的 docker 实验,它可能有意义。
也许您需要一个中心点来保存和共享状态(其他车辆的位置)并将其返回给多个代理。
将 .osm 文件加载到某种数据库或内部地图表示中的挑战似乎并不是最难的部分,因为它可能在初始化时完成一次,并且想象它不是最关键的性能部分这个。
我想您可能希望通过道路网络进行“路由选择”(考虑单向等?),为您的代理提供一条有目的的路径以到达目的地。如果你想模拟与其他代理的交互,这将变得更加复杂,例如您可能想要模拟堵车,因为其他代理人也以同样的方式前进,甚至因为交通而决定 re-route,因此您可能需要一个非常灵活的路由系统,也许 self-coded.
但是有很多使用 OSM 数据的开源路由系统,至少可以从中汲取灵感。查看此列表:https://wiki.openstreetmap.org/wiki/Routing#Developers
像 OSRM 这样的流行选择旨在扩展到国家大小甚至全球 openstreetmap 数据,但我想这对你来说太过分了(你可能正在考虑在城市道路网络中进行模拟?)。即使是这样。在 docker 容器中工作可能很容易。
或者您可能会发现像 JOSM routing plugin 代码这样的轻量级代码更容易嵌入到您的 docker 图像中并进行自定义(尽管我看到它使用的是名为“JGraphT”的库)
然后从计算出的路线向后工作,您可以计算沿该路径的插值步数,这将使您的模拟代理在每次迭代(模拟运动)中迈出一步
我的意图:
其实我打算:
- 将车辆作为容器实施
- simulate/move 基于 .osm 地图的道路上的这些容器
我对问题的看法:
我已经加载 XML-based
.osm
文件并使用 xml.dom
在 python 中处理它。但我对加载 .osm
文件的性能不满意,因为稍后,我将不得不 add/create 更多车辆作为集装箱模拟到同一条道路上。
需要的建议: 这是我第一次解决与地图相关的问题。事实上,我需要关于如何通过牢记 performance/efficiency 这组要求来进行的建议。在实施方面的建议将不胜感激。提前致谢!
我想通过 运行 大量 docker 容器并行模拟大量车辆可能可行。也许你正在初始化具有不同起始位置等的相同图像作为 ENV 变量传入?作为进行代理模拟的实用方法,这对我来说听起来有点 over-engineered,但作为一个有趣的 docker 实验,它可能有意义。
也许您需要一个中心点来保存和共享状态(其他车辆的位置)并将其返回给多个代理。
将 .osm 文件加载到某种数据库或内部地图表示中的挑战似乎并不是最难的部分,因为它可能在初始化时完成一次,并且想象它不是最关键的性能部分这个。
我想您可能希望通过道路网络进行“路由选择”(考虑单向等?),为您的代理提供一条有目的的路径以到达目的地。如果你想模拟与其他代理的交互,这将变得更加复杂,例如您可能想要模拟堵车,因为其他代理人也以同样的方式前进,甚至因为交通而决定 re-route,因此您可能需要一个非常灵活的路由系统,也许 self-coded.
但是有很多使用 OSM 数据的开源路由系统,至少可以从中汲取灵感。查看此列表:https://wiki.openstreetmap.org/wiki/Routing#Developers
像 OSRM 这样的流行选择旨在扩展到国家大小甚至全球 openstreetmap 数据,但我想这对你来说太过分了(你可能正在考虑在城市道路网络中进行模拟?)。即使是这样。在 docker 容器中工作可能很容易。
或者您可能会发现像 JOSM routing plugin 代码这样的轻量级代码更容易嵌入到您的 docker 图像中并进行自定义(尽管我看到它使用的是名为“JGraphT”的库)
然后从计算出的路线向后工作,您可以计算沿该路径的插值步数,这将使您的模拟代理在每次迭代(模拟运动)中迈出一步