要求的结果:
一个包含两个表“edges”和“nodes”的数据库,可用于生成表示某个区域(例如城市)中所有可行驶道路(高速公路)的图表。数据集是从 .osm 文件中解析的。
背景:
我将第二次尝试创建一个包含两个表的数据库 - 节点和边,可用于对其进行不同的最短路径计算。
首先,我尝试手动将不同的数据提取到数据库中(php 脚本):
- 将 .osm 文件中的所有节点解析为“节点”表
- 将所有边解析到“边”表中(即解析路径并从中生成边(由起始节点和目标节点组成),同时将标签添加到边;
- 从边表中删除所有具有黑名单标签(不是高速公路)的边;
- 从节点表中删除边缘表中不存在的所有节点。
问题是这个序列非常不可靠,它只能在小数据集上“马马虎虎”地工作,比如数千个节点,而不是数百万个节点。
问题:
对于由数百万个节点和边组成的数据库,道路提取(即基于特定标签过滤器生成边)非常慢。
可能的解决方案:
这次我要做的是:
- 设置 PostgreSQL rdbms;
- 使用 OSM 现成的脚本解析 .osm 文件以获得完整的节点、路径和关系表;
- 从ways表中提取所有带有特定标签(例如'highway')的边缘到一个新的'edges'表中;
- 将边缘表中存在的所有节点提取到新的 graph_nodes 表中;
- 之后,我可能可以从“edges”和“graph_nodes”表中生成“roads”图。
问题:
如何正确地将 .osm 文件解析到数据库中以生成“edges”和“nodes”表?
如何仅将 .osm 中的可行驶道路提取到数据库中?
如何快速完成(我的意思是为数百万个节点和边表运行数小时的脚本,而不是数周)?
我应该考虑关系吗?
如果是,我该怎么做?