在 Graphhopper 中,如何检索包含在路由中的边集?
In Graphhopper, how can I retrieve the set of edges contained in a route?
我目前正在一个应用程序中使用 GraphHopper,该应用程序检测客户的路线是否经过特定兴趣点 (PoI)。一个 PoI 有一条或多条道路可供客户通过(为每个 PoI 预定义)。
我认为最快的方法是找到每条客户路线,并查看路线内的边是否包含通过 PoI 的任何边。以下代码查找最接近存储在 GHResponse 对象中的点的所有边(在下面的代码中称为 'route')。
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());
}
这使用每条道路的端点并搜索最近的边缘,我可能 return 该节点的任何边缘。我更喜欢路线中的 edgeID 列表,这样我就可以将它们与每个 PoI 的边缘进行比较。
如有任何建议,我们将不胜感激。干杯!
感谢 Karussell 的建议,我创建了自己的自定义 GraphHopper 对象,该对象对 return 路线中使用的边实施特定方法。
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;
}
}
此方法不会 return 路线本身,这意味着如果您同时需要路线和边缘,则应修改它。 运行 此自定义 GraphHopper 对象的 route
和 routePaths
方法都是低效的。
我目前正在一个应用程序中使用 GraphHopper,该应用程序检测客户的路线是否经过特定兴趣点 (PoI)。一个 PoI 有一条或多条道路可供客户通过(为每个 PoI 预定义)。
我认为最快的方法是找到每条客户路线,并查看路线内的边是否包含通过 PoI 的任何边。以下代码查找最接近存储在 GHResponse 对象中的点的所有边(在下面的代码中称为 'route')。
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());
}
这使用每条道路的端点并搜索最近的边缘,我可能 return 该节点的任何边缘。我更喜欢路线中的 edgeID 列表,这样我就可以将它们与每个 PoI 的边缘进行比较。
如有任何建议,我们将不胜感激。干杯!
感谢 Karussell 的建议,我创建了自己的自定义 GraphHopper 对象,该对象对 return 路线中使用的边实施特定方法。
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;
}
}
此方法不会 return 路线本身,这意味着如果您同时需要路线和边缘,则应修改它。 运行 此自定义 GraphHopper 对象的 route
和 routePaths
方法都是低效的。