来自 OSM 的路由网络

Routing network from OSM

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

我发现了这个:

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

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

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

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

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

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

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

导入 OSM 数据

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

正在准备数据

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

OGR2OGR 给你 tables "lines"、"points"、"multipolygons"、"multilinestrings"。我建议您阅读 OSM 以准确了解这些 table 中的内容,但是,粗略地说,这些线包含您的道路,多边形包含建筑物等。地址。地址位于名为 "other_tags" 的 hstore 列中。

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

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

  • 要么 snap 最近节点的地址,要么 将地址关联到最近的节点

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

路由

您的应用程序将向您的服务器发送(以尚未指定的方式)一对地址或坐标,您需要 postgis 到 return 路线。使用 pgrouting,这很容易,并且有很多示例,例如 here。您将需要编写将输出连接到您的地址的查询 table 以获得所需的输出。

pgrouting 创建一个顶点 table。您可以使用以下查询获取最近的顶点:

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

使用输出

使用来自地理服务器的 WMS 不太可能是一个好的选择 - 如果不进行大量操作,您将无法获得关于各个边的信息。您可能会考虑 geoJSON,它可以由例如OpenLayers、Leaflet,或者你可以在Javascript中操作。 Postgres 有很多有用的函数来处理 json 和 geojson.

结论

如果您的 GIS 知识很少,那么这需要大量的工作,而且可能是新东西,而且它,呃,基本上重现了您从 Graphhopper 获得的内容!您确定这不是更好的方法吗?

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