如何从.osm文件在数据库中构建“道路”图

时间:2011-04-26 12:22:41

标签: mysql postgresql xml-parsing openstreetmap

必填结果:

具有两个表,“边缘”和“节点”的数据库,可用于生成表示某个区域(例如城市)中所有可行驶道路(高速公路)的图表。数据集是从.osm文件中解析的。

背景

我要第二次尝试创建一个包含两个表的数据库 - 节点和边缘,可用于对其进行不同的最短路径计算。

首先我尝试手动将不同的数据提取到数据库中(php脚本):

  • 将.osm文件中的所有节点解析为“节点”表
  • 将所有边缘解析为'edges'表(即解析方式并生成边缘(包括起始节点和目标节点),同时将标记添加到边缘;
  • 从边缘表中删除所有具有黑名单标签(不是高速公路)的边缘;
  • 从节点表中删除边表中不存在的所有节点。

问题是这个序列是非常不可靠的,它只能在小数据集上运行“如此”,例如数千个节点,而不是数百万个。

问题:

对于由数百万个节点和边组成的数据库,道路提取(例如,基于某个标签过滤器生成边缘)非常慢。

可能的解决方案:

这次我要做什么:

  • 设置PostgreSQL rdbms;
  • 使用OSM现成的脚本解析.osm文件以获取完整的节点,方式和关系表;
  • 从道路表中将带有某些标签的所有边缘(例如“高速公路”)提取到新的“边缘”表格中;
  • 将edge表中存在的所有节点提取到新的graph_nodes表中;
  • 之后我可能会从'edges'和'graph_nodes'表中生成'道路'图。

问题:

如何正确地将.osm文件解析为数据库,以便将'edge'和'nodes'表作为结果?

如何从.osm中仅提取可行驶的道路进入数据库?

我如何快速完成(我的意思是为数百万个节点和边缘表运行数小时的脚本,而不是数周)?

我应该考虑到关系吗?

如果是,我应该怎么做?

2 个答案:

答案 0 :(得分:1)

正如我在评论中提到的,实际上不需要插入被列入黑名单的边缘。另外,我想到了另一个问题。为什么还需要从节点表中删除节点?您可以在节点表中添加一个特殊的标志字段(我们称之为 used )。

将新行插入节点表时,此字段设置为false。您还可以在边缘表中实现插入的触发器,对于每个插入的行,节点表中的相应行都标记为已使用。

完成后,您可以删除所有未使用的节点。也就是说,我想你现在使用这样的东西:

delete from nodes where id not in (select start_node from edges);
delete from nodes where id not in (select end_node from edges);

我建议你做以下事情:

delete from nodes where used = false;

答案 1 :(得分:0)

您可以使用渗透来执行任务。那你只需提供一个边界框...... 有关多个示例和进一步说明,请检查:this link (查看“示例用法”一章)