Мы собираемся сделать некоторые специальные ребра, которые нельзя использовать в маршрутизации временно.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-файле, просто сохраняя идентификатор края и идентификатор узлов, состоящий из него?
А, ладно. Как кажется, у вас уже есть это отключено. Хм, возможно, у вас была перезагрузка между ними, и вам нужно сделать graph.flush до этого? – Karussell
Я добавил hopper.flush, но результат все еще не прав. Я новичок в работе с Graphhopper. Является ли место, где я добавляю флеш(), не так? Здесь я размещаю весь код. @Karussell –
не нужно вызывать флеш, если между ними нет перезагрузки. Вы уверены, что 'if (distance <= 1)' вызывается? – Karussell