首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从.osm文件在数据库中构建“道路”图

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

Stack Overflow用户
提问于 2011-04-26 12:22:41
回答 2查看 3.3K关注 0票数 5

必需的结果:

一个有两个表‘边’和‘节点’的数据库,可以用来生成一个图,它代表了某一地区(如城市)所有可行驶的道路(公路)。数据集是从.osm文件中解析的。

背景:

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

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

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

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

问题:

一个由数以百万计的节点和边缘组成的数据库,进行道路提取。根据特定的标签过滤器生成边缘是非常慢的。

可能的解决方案:

这次我要做的是:

  • 建立PostgreSQL关系数据库;
  • 使用OSM现成的脚本解析.osm文件,以获得完整的节点、方式和关系表;
  • 将带有特定标记(例如“公路”)的所有边缘提取到新的“边”表中;
  • 将边缘表中的所有节点提取到一个新的graph_nodes表中;
  • 在那之后,我可能会从‘边’和'graph_nodes‘表中生成一个’路况‘图。

问题:

如何正确地将.osm文件解析到数据库中,从而生成“边缘”和“节点”表?

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

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

我应该把关系考虑进去吗?

如果是,我该怎么做?

EN

回答 2

Stack Overflow用户

发布于 2011-04-26 12:34:26

正如我在评论中提到的,在哪里真的没有必要插入被列入黑名单的边缘。另外,另一个问题出现在我的脑海中。为什么要删除节点表中的节点呢?您可以在节点表中添加一个特殊的标志字段(我们称之为used)。

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

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

代码语言:javascript
复制
delete from nodes where id not in (select start_node from edges);
delete from nodes where id not in (select end_node from edges);

我建议你做以下几件事:

代码语言:javascript
复制
delete from nodes where used = false;
票数 1
EN

Stack Overflow用户

发布于 2012-08-10 06:05:55

您可以使用渗透来执行任务。那你只需要提供一个包围盒..。关于多个示例和进一步的解释,请检查:此链接(查看“示例用法”一章)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5790227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档