Cómo usar GraphHopper para construir sus propias rutas para caminar

Construyendo rutas ..., la gente lo usa habitualmente, especialmente para rutas en automóvil, en navegadores.





También hay muchas soluciones para construir una ruta, incluido GraphHopper , que sabe cómo construir rutas para automóviles y para peatones, e incluso para caminatas, que probablemente sea adecuado en el 99% de los casos.





A continuación, hablaremos sobre qué hacer en otras situaciones, más precisamente sobre mi experiencia al usar GraphHopper cuando la solución existente no encajaba. Era necesario tener en cuenta restricciones adicionales: construir rutas para caminar para personas con discapacidad. No habrá características significativas de la implementación de esta tarea en particular. Generalizado.





Describirá cómo crear su propio servicio web basado en la biblioteca GraphHopper, que, según las coordenadas del inicio y el final de la ruta, devolverá una matriz de coordenadas de ruta.





Una aplicación de muestra, con todos los stubs que necesita para ejecutar, se puede encontrar en mi repositorio en GitHub .





GraphHopper es un motor de enrutamiento escrito en Java. Publicado bajo la licencia de Apache y puede integrarse en productos de código cerrado.





Se encuentran artículos de este tipo en Habré, por ejemplo, Caminando por la ciudad sabiamente , pero no brinda detalles de implementación, lamentablemente, y ... bueno, ya está.





También en la publicación Noticias del mundo de OpenStreetMap No. 512 (05/05/2020 - 05/11/2020) , hubo noticias del siguiente contenido:





Los desarrolladores de GraphHopper están esperando nuestros comentarios, ya que introdujeron una nueva característica que permite incluso a personas sin programación o conocimientos de Java cambiar el modelo de construcción de rutas.





Probablemente, esta nueva función cubrirá otro 0,99% de las situaciones posibles, probablemente también sea adecuada para su tarea, no se requieren conocimientos de Java y no surgirá ningún problema. Les contaré mi experiencia en la creación de reglas para la construcción de rutas, cuando esta función no existía y quedaban 2 años antes de su creación.





Se requiere conocimiento de Java.





, , :









  • 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;
}
      
      



Si tiene la oportunidad, para su tarea, use la segunda opción, basada en verificar etiquetas; es mejor preferirla. Esto no está de más mezclar una lógica adicional que no encaja en este enfoque.





¡Buena suerte!








All Articles