【问题标题】:Routing network from OSM来自 OSM 的路由网络
【发布时间】:2017-03-28 16:53:01
【问题描述】:

我正在寻找一些好的工具来将 map.osm 导入 postgres,然后创建一些将由 geoserver 显示的路线。我需要路线,带有一些关于顶点的文本信息(例如城市、地址、地址编号等...)

我发现了这个:

osm2pgrouting - 将 OSM 数据导入 pgRouting 数据库
osm2postgis - 将 OSM 数据导入 PostGIS
osm2po - 转换工具OSM 数据转换为可路由格式
osm4routing - OpenStreetMap 数据解析器将它们转换为适合路由应用程序的节点边缘

我在 GIS 方面没有太多经验,那么哪种工具最适合我?我尝试使用 osm2pgrouting,但结果我有表格,其中不包含有关顶点的数据(仅纬度和 alt。)感谢您的回答。 更新应用信息: 我将有 web 和 android 客户端,用户在其中输入开始和结束节点的文本值,然后通过 geoserver 获取带有输入路径顶点的 wms,例如
我的结果可能是像这样的一些边缘和节点: sequence_num、edge_distance,以及关于边缘顶点的信息,如 osm_id、一些文本值、lat alt 等......

【问题讨论】:

  • 好的,所有这些工具都会产生数据,但是您想如何使用这些数据呢?您将使用哪种路由应用程序?将此信息添加到问题中。
  • 我更新了我的问题,你能检查一下吗?
  • 目前还不清楚你的最终应用是什么。在客户端,WMS 是一个图像,不适合返回边和节点。你到底要返​​回什么——一张图片,一个列表,两者兼而有之,还是什么?同样,用户输入的究竟是什么?单击/点击地图(即坐标)、输入地址或选择节点 ID(可能带有描述)?你是不是例如在您的客户端中使用 Leaflet 或 OpenLayers?
  • 尝试想象一些带有节点的道路,其中道路弯曲......这就是我需要的......关于这些节点之间的边缘的信息,例如最大速度,道路类型和有关节点的信息例如,如果它是城市,那么名称...但是我认为有关节点的信息对我来说更重要

标签: postgresql routing openstreetmap postgis geoserver


【解决方案1】:

我认为在找到完整的解决方案之前您还有很多工作要做,但这里有一些建议。我建议您将项目分解成更小的部分,并针对您可能遇到的任何问题提出具体问题。

首先,您需要导入数据。然后你需要一些预处理/清洁。然后你需要你的路由查询,最后,需要一种使用输出的方法(最后一部分在一定程度上决定了前面的步骤)。

导入 OSM 数据

正如我在回答您之前的问题 here 时所描述的,您可以使用 OGR2OGR 将 OSM 数据导入 Postgis。如上所述,您可以使用其他程序,但我想您会得到大致相同的结果。我认为 OGR2OGR 表和 osm2postgis 表之间的区别在于后者中的某些列出现在 other_tags 列中。但是,数据仍然存在,您只需要稍微不同的查询即可。

准备数据

我假设您将使用pgrouting 进行路由,但无论您使用什么,您都需要一个适合路由的网络(简而言之,边缘有一个起点和终点节点,而终点节点必须与其他起始节点连接)。 Pgrouting 有工具来创建您需要的内容并对其进行验证。例如。您创建整数列 sourcetarget 并且函数 pgr_createtopology 将为您填充列。

OGR2OGR 为您提供表格“线”、“点”、“多面体”、“多线串”。我建议您阅读 OSM 以准确了解这些表格中的内容,但是,粗略地说,线条包含您的道路,而多面体包含建筑物,例如地址。地址位于名为“other_tags”的hstore 列中。

这些行不包含地址! (尽管它们确实包含街道名称)。所以,如果你想做地址到地址的路由,你需要做一些准备。如果您可以接受街道名称,则可以跳过此步骤。

  • 创建您的网络(例如,如果您要为汽车路由,您需要 扔掉行人路线等等)
  • 提取所需地址(包括坐标)

  • snap 到最近节点的地址,或者其他 将地址与最近的节点相关联

Pgrouting 将返回您路线中的边缘,因此您需要将上述内容与您的地址相关联。

路由

您的应用将向您的服务器(以一种尚未指定的方式)发送一对地址或坐标,您需要 postgis 来返回路线。使用 pgrouting,这很容易,并且有很多示例,例如 here。您将需要编写将输出连接到地址表的查询,以便为您提供所需的输出。

pgrouting 创建一个顶点表。您可以通过以下查询获得最近的顶点:

select id from vertices_pgr
order by the_geom <-> st_setsrid(st_point(lon,lat),4326)
limit 1

使用输出

使用 geoserver 中的 WMS 不太可能是一个好的选择 - 如果没有很多麻烦,您将无法获得有关各个边缘的信息。您可以考虑geoJSON,例如可以阅读。 OpenLayers、Leaflet,或者您可以在 Javascript 中进行操作。 Postgres 有很多有用的函数来处理 json 和 geojson。

结论

如果您对 GIS 知识知之甚少,这可能是一项相当多的工作,而且可能是新东西,而且它,呃,基本上是重新创建您从 Graphhopper 获得的东西!你确定这不是更好的方法吗?

如果您决定采用这条(或类似的)路线,请将事情分解成可管理的块!首先,弄清楚你想要达到的目标,然后从那里倒退。如果您决定使用 OSM / pgrouting,请先使用数据和 pgrouting,以便在尝试地址匹配等之前了解它的工作原理。

【讨论】:

  • 感谢您的详细回答我有一些问题,所以我将其拆分为您的部分:导入 OSM:所以如果我没记错的话,这个工具会为我提供来自 OSM 文件的一般数据。您描述的结果看起来与 osm2pgsql 的结果相同,对吗?准备数据:我可以对我拥有的这些数据使用 pgrouting,还是可以通过 osm2pgrouting 创建新表?输出:用户输入 2 个字符串(指向和指向),你能给我一些提示如何获取这些点的坐标或 osm_id 吗?非常感谢!!
  • 嗨,学习了一些材料,我遇到了一个问题。许多教程解决了通过某些框架(例如 OpenLayers3)显示从 osm 服务器下载的基础层。是否可以在不从客户端上的外部服务器下载的情况下通过瓷砖通过地理服务器发送基础层?谢谢回答
  • 可以使用您下载到服务器的数据从您自己的地理服务器为基础层(如 wms)提供服务,是的。但是您需要对数据(在 postgis 和 geoserver 中)进行样式设置和配置,以复制您使用 Openlayers 的一行代码所获得的内容。
  • 我别无选择,因为这是我的工作任务:/你能给我一些具体的提示吗?我可以在哪里找到这些东西所需的材料?
  • 您需要搜索“OSM 风格”,例如gis.stackexchange.com/questions/86802/…
【解决方案2】:

您列出的工具仅用于生成数据,但我认为您实际上需要一个路由引擎。 试试 Graphhopper:https://graphhopper.com

使用 WEB Api(更可能是您需要的),您不需要在数据库中导入数据。这是最简单的解决方案。您将无法控制输入的 openstreetmap 数据,但如果您没有特殊要求,这很好。

直接在您的应用程序中导入数据和实施/集成路由引擎会复杂得多。

【讨论】:

  • 我知道graphhopper,但我的任务是创建该应用程序,将离线工作
  • 这是一个非常重要的信息,应该添加到问题中
  • 但是,这没有任何意义:您不能构建使用 Postgres 数据库并离线工作的 android 应用程序。更别提网络客户端了……
  • 这不是很好的解释......“离线”我的意思是,wms 将是唯一的服务,客户调用什么来显示地图(没有别的)......这不是我的想法...... . 我得到了那个任务:(
  • GraphHopper 也可以在 Android 和 iOS 上离线运行。
猜你喜欢
  • 1970-01-01
  • 2014-06-15
  • 1970-01-01
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
相关资源
最近更新 更多