2016-11-23 44 views
1

我想阻塞某些道路,并在生成路线时避开它。在graphhopper中封锁某条道路

我使用Graphhopper basic map sample

我发现这个代码 Weighting。我相信这是我正在寻找的功能,但我没有把它整合在一起。

我真的很感谢在展示如何将两个代码放在一起的帮助。示例代码非常感谢。

在此先感谢。

+0

看一看这个类:https://github.com/graphhopper/graphhopper/blob/master/core/src/main/java/com/graphhopper/routing/weighting/AvoidEdgesWeighting.java或本存储库:https://github.com/karussell/graphhopper-traffic-data-integration – Karussell

+0

谢谢你sir @karussell,我检查了样本,但不幸的是我无法弄清楚结合这两个代码。对不起,新手。我可以看到更简单的样本吗?有点,显示一个基本的grapphopper地图代码,在基本的grapphoer示例代码中调用一个权重类或避免边缘。预先感谢您 – Mellorine

+0

查看最近的拉请求https://github.com/graphhopper/graphhopper/pull/890 – Karussell

回答

2

所以,我会分享我的代码示例,它显示了我如何实现自定义加权,但它们与您提到的example类似。

首先,您必须扩展类GraphHopper并覆盖方法createWeighting(WeightingMap weightingMap, FlagEncoder encoder)

public class MyGraphHopper extends GraphHopper { 

    @Override 
    public Weighting createWeighting(WeightingMap weightingMap, FlagEncoder encoder) { 
     String weighting = weightingMap.getWeighting(); 
     if (Consts.CURRENT_TRAFFIC.equalsIgnoreCase(weighting)) { 
      return new CurrentTrafficWeighting(encoder); 
     } else { 
      return super.createWeighting(weightingMap, encoder); 
     } 
    } 

} 

然后,你实现自定义加权,在你的情况下,你实现阻止一些道路的逻辑。

public class CurrentTrafficWeighting extends AbstractWeighting { 

    protected final static double SPEED_CONV = 3.6; 

    public CurrentTrafficWeighting(FlagEncoder encoder) { 
     super(encoder); 
     System.out.println("Current traffic weighting"); 
    } 

    @Override 
    public double getMinWeight(double distance) { 
     return distance; 
    } 

    @Override 
    public double calcWeight(EdgeIteratorState edgeState, boolean reverse, int prevOrNextEdgeId) { 
     double speed = reverse ? flagEncoder.getReverseSpeed(edgeState.getFlags()) : flagEncoder.getSpeed(edgeState.getFlags()); 
     if (speed == 0) 
      return Double.POSITIVE_INFINITY; 
     double time = edgeState.getDistance()/speed * SPEED_CONV; 
     return time; 
    } 

    @Override 
    public String getName() { 
     return Consts.CURRENT_TRAFFIC; 
    } 

} 

现在,也许对你来说最重要的部分,它展示了如何加入这两部分代码。当您创建新请求时,您必须将权重设置为自定义权重(您实施的权重权重)。通过这种方式,您将使用您的自定义加权与一些道路阻塞,同时计算最佳路线。

public static void main(String[] args) { 

    MyGraphHopper hopper = new MyGraphHopper(); 
    hopper.setOSMFile(OSM_FILE_PATH); 

    hopper.setGraphHopperLocation(GRAPH_FOLDER); 
    hopper.clean(); 
    hopper.setEncodingManager(new EncodingManager("car")); 
    hopper.setCHEnable(false); 
    hopper.importOrLoad(); 

    GHRequest req = new GHRequest(startPoint.getX(), startPoint.getY(), finishPoint.getX(), finishPoint.getY()) 
      .setWeighting(Consts.CURRENT_TRAFFIC) 
      .setVehicle("car") 
      .setLocale(Locale.US) 
      .setAlgorithm(AlgorithmOptions.DIJKSTRA_BI); 

    GHResponse rsp = hopper.route(req); 

}