2015-03-23 3 views
0

Мы собираемся сделать некоторые специальные ребра, которые нельзя использовать в маршрутизации временно.Graphhopper не может маршрутизировать, используя динамические веса края?

Я нашел вопрос, очень похожий на наш вопрос: Does GraphHopper support dynamic edge weights? Так что я не использовать алгоритм CH, изменять их расстояние до огромного значения после того, как я отфильтровать края мне нужно.

В основе лежат два метода, которые я добавляю в class GraphHopper. Я добавил hopper.flush, но результат все еще не прав.

Я пишу метод processChange(), пытающийся представить обратную связь данных трафика. Если вы укажете местоположение (lat & lon), где имеется затор или , и позвоните по телефону processChange(). Он выберет края, которые находятся на расстоянии одного метра от этой точки местоположения, и измените расстояние до этих краев до 10000000, чтобы эти края не использовались в маршрутизации временно. Метод pointToLine() предназначен для расчета расстояния между точкой местоположения до края.

public static GraphHopper processChange(double[] dirtyCoor){ 
    double[] dirtyPoint; 
    dirtyPoint = dirtyCoor; 

    GraphHopper hopper = new GraphHopper(); 
    hopper.setGraphHopperLocation("gh-problem") 
      .setEncodingManager(new EncodingManager("car")) 
      .setOSMFile("foshan.osm") 
      .forServer() 
      .setCHWeighting("no") 
      .setCHEnable(false); 
    hopper.importOrLoad(); 

    GraphStorage g =hopper.getGraph(); 

    AllEdgesIterator edges = g.getAllEdges(); 
    int n =edges.getCount(); 

    EdgeIterator iter = g.getAllEdges(); 

    int[] edgeIds; 
    edgeIds = new int[n]; 
    int[] startNodeId; 
    startNodeId = new int[n]; 
    int[] endNodeId; 
    endNodeId = new int[n]; 
    double[] SNlat; 
    double[] SNlon; 
    double[] ENlat; 
    double[] ENlon; 
    SNlat = new double[n]; 
    SNlon = new double[n]; 
    ENlat = new double[n]; 
    ENlon = new double[n]; 

    int i=0; 
    while (iter.next()) { 
     int edgeId = iter.getEdge(); 
     edgeIds[i] = edgeId; 

     int nodeA = iter.getBaseNode(); 
     int nodeB = iter.getAdjNode(); 
     startNodeId[i] = nodeA; 
     endNodeId[i] = nodeB; 

     NodeAccess nodeAccess = g.getNodeAccess(); 
     double lat = nodeAccess.getLatitude(nodeA); 
     double lon = nodeAccess.getLongitude(nodeA); 
     SNlat[i] = lat; 
     SNlon[i] = lon; 

     double adjLat = nodeAccess.getLatitude(nodeB); 
     double adjLon = nodeAccess.getLongitude(nodeB); 
     ENlat[i] = adjLat; 
     ENlon[i] = adjLon; 

     double distance = pointToLine(SNlat[i],SNlon[i],ENlat[i],ENlon[i],dirtyPoint[0],dirtyPoint[1]); 

     if (distance <= 1){ 
      double preDist = iter.getDistance(); 

      iter.setDistance(1000000); 
      double cDist = iter.getDistance(); 

     } 
     i=i+1; 
    } 

    hopper.flush(); 
    hopper.setGraph(g); 

    //routeing test 
    double[] orig = new double[]{23.0389909, 113.096614}; 
    double[] dest = new double[]{23.0389031, 113.1028902}; 

    GHRequest request = new GHRequest(orig[0], orig[1], dest[0], dest[1]); 
    request.setWeighting("fastest"); 
    request.setVehicle("car"); 

    GHResponse route = hopper.route(request); 

    double time=route.getMillis(); 
    double dis=route.getDistance(); 

    System.out.println("distance=" + dis); 
    System.out.println("time=" + time); 

    return hopper; 
} 




public static double pointToLine(double SNlat, double SNlon, double ENlat, double ENlon, double DPlat, double DPlon) { 
    double space = 0; 

    double edgeLength = new DistanceCalcEarth().calcDist(SNlat, SNlon, ENlat, ENlon); 
    double SN2DP = new DistanceCalcEarth().calcDist(SNlat, SNlon, DPlat, DPlon); 
    double EN2DP = new DistanceCalcEarth().calcDist(ENlat, ENlon, DPlat, DPlon); 

    if (Math.abs((SN2DP + EN2DP) - edgeLength)<=0.000001){ 
     space = 0; 
     return space; 
    } 
    else{ 
     double p = (edgeLength + EN2DP + SN2DP)/2; 
     double s = Math.sqrt(p * (p - edgeLength) * (p - SN2DP) * (p - EN2DP)); 
     space = 2 * s/edgeLength; 
     return space; 
    } 

} 

I выход предыдущего расстояния и измененное расстояние, чтобы увидеть дозировать его работы:

preDistance is: 339.245  changed distance is: 1000000.0 

Но когда я маршрут, я обнаружил, расстояние до сих пор не меняется. Почему это произойдет? Может ли route.getDistance считывать различное значение из edge.getDistance()? Значения веса ребер сохраняются в gh-файле или gh-файле, просто сохраняя идентификатор края и идентификатор узлов, состоящий из него?

ответ

0

Вам необходимо включить режим гибкости с помощью prepare.chWeighting=no

Э.Г. см. сообщение this blog, где я описываю, как интегрировать данные трафика в реальном времени

+0

А, ладно. Как кажется, у вас уже есть это отключено. Хм, возможно, у вас была перезагрузка между ними, и вам нужно сделать graph.flush до этого? – Karussell

+0

Я добавил hopper.flush, но результат все еще не прав. Я новичок в работе с Graphhopper. Является ли место, где я добавляю флеш(), не так? Здесь я размещаю весь код. @Karussell –

+0

не нужно вызывать флеш, если между ними нет перезагрузки. Вы уверены, что 'if (distance <= 1)' вызывается? – Karussell

 Смежные вопросы

  • Нет связанных вопросов^_^