在 Graphhopper 中,如何检索路由中包含的边集



我目前正在一个应用程序中使用GraphHopper,该应用程序可以检测客户的路线是否经过特定的兴趣点(PoI)。一个 PoI 有一条或多条道路,客户可以通过这些道路(为每个 PoI 预定义)。

我认为,最快的方法是找到每个客户路由,并查看路由中的边缘是否包括通过 PoI 的任何边缘。以下代码查找最接近存储在 GHResponse 对象中的点的所有边(在下面的代码中称为"路由")。

QueryResult qr;
HashMap<String, EdgeIteratorState> routeEdges= new HashMap<String, EdgeIteratorState>();
for(GHPoint p:route.getPoints()){
    qr = index.findClosest(p.getLat(), p.getLon(), EdgeFilter.ALL_EDGES );
    routeEdges.put(qr.getClosestEdge().toString(), qr.getClosestEdge());
}

这使用每条道路的端点并搜索最近的边,我可能会返回该节点上的任何边。我更喜欢路由中的 edgeID 列表,这样我就可以将它们与每个 PoI 的边缘进行比较。

任何建议将不胜感激。干杯!

感谢 Karussell 的建议,我创建了自己的自定义 GraphHopper 对象,该对象实现了返回路由中使用的边的特定方法。

public class GraphHopperWithPaths extends GraphHopper {
public List<Integer> routePaths(double startY, double startX, double endY, double endX){
    //Examine a route and return edgeIDs that GraphHopper uses
    LocationIndex index = this.getLocationIndex();
    GHRequest request = new GHRequest(startY, startX, endY, endX);
    GHResponse response = new GHResponse();
    List<Path> paths = getPaths(request, response);
    List<Integer> edges = new ArrayList<Integer>();
    for(Path p:paths){
        for(EdgeIteratorState e:p.calcEdges()){
            edges.add(e.getEdge());
        }
    }
    if (response.hasErrors()) return null;
    //Get edges for start and end point as well
    QueryResult qr = index.findClosest(startY, startX, EdgeFilter.ALL_EDGES );
    edges.add(qr.getClosestEdge().getEdge());
    qr = index.findClosest(endY, endX, EdgeFilter.ALL_EDGES );
    edges.add(qr.getClosestEdge().getEdge());
    return edges;
}
}

此方法不返回路由本身,这意味着如果同时需要路由和边,则应对其进行修改。同时运行此自定义 GraphHopper 对象的 routeroutePaths 方法效率低下。

相关内容

  • 没有找到相关文章

最新更新