So erstellen Sie mit GraphHopper Ihre eigenen Wanderrouten

Bauen von Routen ... wird regelmäßig von Navigatoren verwendet, insbesondere für Autorouten.





Es gibt auch viele Lösungen zum Erstellen einer Route, einschließlich GraphHopper , der weiß, wie man Routen für Autos und Fußgänger erstellt, und sogar zum Wandern, was wahrscheinlich in 99% der Fälle geeignet ist.





Als nächstes werden wir darüber sprechen, was in anderen Situationen zu tun ist, genauer über meine Erfahrungen mit GraphHopper, als die vorhandene Lösung nicht passte. Zusätzliche Einschränkungen mussten berücksichtigt werden: Wanderwege für Menschen mit Behinderungen zu bauen. Es wird keine wesentlichen Merkmale bei der Implementierung dieser speziellen Aufgabe geben. Verallgemeinert.





Es wird beschrieben, wie Sie Ihren eigenen Webdienst basierend auf der GraphHopper-Bibliothek erstellen, die basierend auf den Koordinaten von Anfang und Ende des Pfads ein Array von Routenkoordinaten zurückgibt.





Eine Beispielanwendung mit allen zum Ausführen erforderlichen Stubs finden Sie in meinem Repository auf GitHub .





GraphHopper ist eine in Java geschriebene Routing-Engine. Wird unter der Apache-Lizenz veröffentlicht und kann in Closed-Source-Produkte eingebettet werden.





Artikel dieser Art über Habré finden sich zum Beispiel: Mit Bedacht durch die Stadt laufen , aber leider keine Details zur Implementierung enthalten, und ... nun, das war's.





Auch in der Veröffentlichung Nachrichten aus der Welt von OpenStreetMap Nr. 512 (05/05/2020 - 05/11/2020) gab es Nachrichten mit folgendem Inhalt:





Die GraphHopper-Entwickler warten auf unsere Kommentare, da sie eine neue Funktion eingeführt haben, mit der auch Personen ohne Programmier- oder Java-Kenntnisse das Routenbildungsmodell ändern können.





Wahrscheinlich wird diese neue Funktion weitere 0,99% der möglichen Situationen abdecken, sie wird wahrscheinlich auch für Ihre Aufgabe geeignet sein, Java-Kenntnisse sind nicht erforderlich und es treten überhaupt keine Probleme auf. Ich werde Ihnen von meinen Erfahrungen beim Erstellen von Regeln für das Erstellen von Routen erzählen, als diese Funktion nicht vorhanden war und noch 2 Jahre bis zu ihrer Erstellung übrig waren.





Java-Kenntnisse sind erforderlich.





, , :









  • GraphHopper OSM, , OSM. , , OSM. . , .





GraphHopper 0.10.0, .





.





Maven:





<dependency>
	<groupId>com.graphhopper</groupId>
	<artifactId>graphhopper-reader-osm</artifactId>
	<version>0.10.0</version>
</dependency> 
      
      



GraphHopper, , github. , How to create new routing profile aka a new FlagEncoder? , , FlagEncoder



. FlagEncoder



, com.graphhopper.routing.util



, FootFlagEncoder



, .. , AbstractFlagEncoder



, .





GraphHopper ( ) GraphHopper Documentation RoutingExample.java.





FlagEncoder

, FlagEncoder



AbstractFlagEncoder



, FootFlagEncoder



, FootFlagEncoder



, . AbstractFlagEncoder



FootFlagEncoder



, , FootFlagEncoder



.





acceptWay



, - ReaderWay



/ . FlagEncoder



. FlagEncoder



, . acceptWay



, – 0.





restricted



, id



way



OSM.





public class MyFlagEncoder {

	
	private List<Long> restricted;
	
	@Override
	public long acceptWay(ReaderWay way) {
        if (restricted.contains(way.getId()))
            return 0;
	}
	
	
}
      
      



, , , 0.





FlagEncoder



, , .





Routing via Java API.





GraphHopper closableInstance = new GraphHopperOSM().setOSMFile(osmFilePath).forServer();
closableInstance.setStoreOnFlush(true);
closableInstance.setGraphHopperLocation(graphFolder);
closableInstance.setEncodingManager(new EncodingManager(encoder));
closableInstance.setCHEnabled(false);

GraphHopper hopper = closableInstance.importOrLoad();
      
      







  • osmFilePath - pbf- , pbf geofabrik, , OSM;





  • encoder – FlagEncoder



    , , ;





  • graphFolder – .





importOrLoad



, FlagEncoder



, .





GraphHopper: Low level API.





importOrLoad



.





GraphHopper closableInstance = new GraphHopperOSM().
	setOSMFile(pbfFile).
	forServer().
	setStoreOnFlush(true).
	setGraphHopperLocation(graphFolder).
	setEncodingManager(new EncodingManager(encoder)).
	setCHEnabled(false);
GraphHopper hopper = closableInstance.importOrLoad();
      
      



LocationIndex



:





GraphHopperStorage graph = hopper.getGraphHopperStorage();
LocationIndex index = new LocationIndexTree(graph, new RAMDirectory());
index.prepareIndex();
      
      



: GraphHopperStorage



, FlagEncoder



, LocationIndex



.





, List<Double[]>



:





QueryResult fromQR = index.findClosest(fromLon, fromLat, EdgeFilter.ALL_EDGES);
QueryResult toQR = index.findClosest(toLon, toLat, EdgeFilter.ALL_EDGES);

QueryGraph queryGraph = new QueryGraph(graph);

//   
queryGraph.lookup(fromQR, toQR);
Dijkstra dij = new Dijkstra(queryGraph, new FastestWeighting(encoder), TraversalMode.NODE_BASED);
Path path = dij.calcPath(fromQR.getClosestNode(), toQR.getClosestNode());

PointList pl = path.calcPoints();
return pl.toGeoJson();
      
      



.. ( acceptWay



) ( ) :





if (restricted.contains(way.getId()))
	return 0;
      
      



- , OSM, :





if (way.hasTag("foot", intendedValues)) {
	return acceptBit;
}
      
      



Wenn Sie die Möglichkeit haben, für Ihre Aufgabe die zweite Option zu verwenden, die auf dem Überprüfen von Tags basiert - es ist besser, sie zu bevorzugen. Es tut nicht weh, zusätzliche Logik einzumischen, die nicht in diesen Ansatz passt.





Viel Glück!








All Articles