我正在寻找一些好的工具来将map.osm导入postgres,然后创建一些将由geoserver显示的路线。我需要路线,有一些关于顶点的文本信息(例如城市,地址,地址号等等)
我发现了这个:
osm2pgrouting - 将OSM数据导入pgRouting数据库
osm2postgis - 将OSM数据导入PostGIS
osm2po - 将OSM数据转换为可路由格式的工具
osm4routing - 将OpenStreetMap数据解析器转换为适合路由应用程序的节点边缘
我没有很多GIS经验,所以工具对我来说最好吗?我尝试osm2pgrouting,但结果我有表,不包含有关顶点的数据(只有lat。和alt。)谢谢你的答案。
更新应用信息:
我将有web和android客户端,用户输入开始和结束节点的文本值,接下来在geoserver上获取带有输入路径顶点的wms例如
我的结果可能是像这样的一些边缘和节点:
sequence_num,edge_distance和有关边缘顶点的信息,如osm_id,一些文本值,lat alt等...
答案 0 :(得分:1)
我认为在你找到一个完整的解决方案之前你还有很多工作要做,但这里有一些指示。我建议你将你的项目分解成更小的块,并就你可能会遇到的任何问题提出具体问题。
首先,您需要导入数据。然后你需要一些预处理/清洁。然后你需要你的路由查询,最后是一种使用输出的方法(最后一部分在某种程度上确定了前面的步骤)。
正如我在回答您之前的问题here时所述,您可以使用OGR2OGR将OSM数据导入Postgis。如上所述,您可以使用其他程序,但我想您会得到相同的结果。我认为OGR2OGR表和osm2postgis表之间的区别在于后者中的一些列出现在other_tags列中。但是,数据仍然存在,您只需要稍微不同的查询。
我假设你将pgrouting用于路由,但无论你使用什么,你都需要一个适合路由的网络(简而言之,边缘有一个开始和终端节点,终端节点必须与其他起始节点连接)。 Pgrouting拥有创建所需内容并进行验证的工具。例如。您创建整数列source
和target
,函数pgr_createtopology
将为您填充列。
OGR2OGR为您提供表格" line"," points"," multipolygons"," multilinestrings"。我建议你阅读OSM以了解这些表格中究竟是什么,但是,粗略地说,这些线条包含你的道路,多边形包含建筑物,例如,地址。地址位于hstore列中,名为" other_tags"。
这些行不包含地址! (虽然它们确实包含街道名称)。因此,如果您想进行地址到地址路由,则需要做一些准备工作。如果您可以使用街道名称,则可以跳过此步骤。
提取所需的地址(包括坐标)
snap最近节点的地址或其他地址 将地址与最近的节点相关联
Pgrouting将返回路线中的边缘,因此您需要将上述内容与您的地址联系起来。
您的应用将发送到您的服务器(以一种尚未指定的方式)一对地址或坐标,您需要postgis才能返回路线。通过pgrouting,这非常简单,并且有很多例子,例如here。您需要编写将输出连接到地址表的查询,以便为您提供所需的输出。
pgrouting创建一个顶点表。您可以使用以下查询获取最近的顶点:
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,以便在尝试地址匹配等之前了解它的工作原理。
答案 1 :(得分:0)
您列出的工具仅用于生成数据,但我认为您实际上需要一个路由引擎。 试试Graphhopper:https://graphhopper.com
使用WEB Api(更可能是您需要的),您不需要导入数据库中的数据。这是最简单的解决方案。您将无法控制输入的openstreetmap数据,但如果您没有特殊要求,这可以。
导入数据并在您的应用程序中直接实现/集成路由引擎会更加复杂。