我正在尝试编写一个程序,该程序使用OSM数据作为输入计算从A到B的最短路径(A *算法)。该程序应该在Android Java中工作。 我使用来自OSM的数据并将其转换为osm_2po(是一个将OSM xml文件转换为sql文件OSM2PO的应用程序),以将数据放入我的PostGIS数据库。 我的数据库有以下条目,据我所知,我需要以下变量: source_id,target_id,x1,y1,x2,y2,成本和反向成本。 其中source_id是基于OSM数据的源节点的id。 (长) 其中target_id是基于OSM数据的目标节点的id。 (长) 其中x1,y1是源节点的坐标(纬度和经度)。 (浮动) 其中x2,y2是目标节点的坐标(纬度和经度)。 (浮动) 成本是从源到目标的生成成本。 (浮动) 反向成本是从目标到源(浮动)的生成成本。 在我的Java程序中,我有一个数据类Node,它将我的节点存储在以下结构中,用于存储我的数据库条目: 来源,目标,成本,x,y,x2,y2 数据类节点本身可以存储x1,y1,x2,y2,bool访问,sourcenode,targetnode,cost,g,h和f。 这将被存储两次。一次src - >目标,反之亦然。 输入具有以下结构: 启动节点:source = 0,target =选定的起始点,所有其他变量都设置为0。 目标节点:source =选定的目标点,所有其他变量都设置为0.
我只有用户想要启动的节点,仅此而已。该算法应分别找出下一个节点是什么并展开它们。 我用于实现的伪代码来自德语维基百科Wikipedia。 openlist是一个priorityqueue,closedlist是一个ArrayList。 在算法中,我使用曼哈顿距离来计算H.
我的问题/疑问是: 我的数据结构是否适合这种实现?或者我是否必须使用为所有前辈和后继者存储节点的结构? 我是否必须通过从数据库中获取数据来设置h?如果是,我该如何计算h?它是从前一个节点到下一个节点的顶点成本吗?
答案 0 :(得分:1)
如果我理解正确,数据库中的每个条目都是图形边缘 - 它有一个源点和一个目标点。我不知道“h”代表什么。
考虑将Node类重命名为“Edge”,因为它似乎代表两个节点之间的路径而不是单个节点。您可以使用整数作为方向,值为-1,0,1而不是布尔值。 但是你的数据结构很好。