5

要求的结果:

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

背景:

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

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

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

问题是这个序列非常不可靠,它只能在小数据集上“马马虎虎”地工作,比如数千个节点,而不是数百万个节点。

问题:

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

可能的解决方案:

这次我要做的是:

  • 设置 PostgreSQL rdbms;
  • 使用 OSM 现成的脚本解析 .osm 文件以获得完整的节点、路径和关系表;
  • 从ways表中提取所有带有特定标签(例如'highway')的边缘到一个新的'edges'表中;
  • 将边缘表中存在的所有节点提取到新的 graph_nodes 表中;
  • 之后,我可能可以从“edges”和“graph_nodes”表中生成“roads”图。

问题:

如何正确地将 .osm 文件解析到数据库中以生成“edges”和“nodes”表?

如何仅将 .osm 中的可行驶道路提取到数据库中?

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

我应该考虑关系吗?

如果是,我该怎么做?

4

2 回答 2

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;
于 2011-04-26T12:34:26.123 回答
0

您可以使用渗透来执行任务。然后你只需要提供一个边界框......对于多个示例和进一步的解释检查:这个链接 (检查“示例用法”一章)

于 2012-08-10T06:05:55.053 回答