ルートを構築する...、人々はナビゲーターで、特に車のルートのためにそれを定期的に使用します。
車や歩行者、さらには99%の場合に適していると思われるハイキングのルートを作成する方法を知っているGraphHopperなど、ルートを作成するためのソリューションもたくさんあります。
次に、他の状況で何をすべきか、より正確には、既存のソリューションが適合しなかったときにGraphHopperを使用した私の経験について説明します。追加の制限を考慮する必要がありました:障害を持つ人々のための歩行ルートを構築すること。この特定のタスクの実装に重要な機能はありません。一般化。
GraphHopperライブラリに基づいて独自のWebサービスを作成する方法について説明します。このライブラリは、パスの開始と終了の座標に基づいて、ルート座標の配列を返します。
実行する必要のあるすべてのスタブを含むサンプルアプリケーションは、GitHubの私のリポジトリにあります。
GraphHopperは、Javaで記述されたルーティングエンジンです。Apacheライセンスの下でリリースされ、クローズドソース製品に組み込むことができます。
Habréに関するこの種の記事は、たとえば、街を賢く歩き回るなどに見られますが、残念ながら、実装の詳細は提供されていません。
また、OpenStreetMap No. 512(05/05 / 2020-05 / 11/2020)の世界からのニュースの出版物には、次の内容のニュースがありました。
GraphHopperの開発者は、プログラミングやJavaの知識がなくてもルート構築モデルを変更できる新機能を導入したため、コメントを待っています。
おそらく、この新しい関数は、考えられる状況のさらに0.99%をカバーし、おそらくあなたのタスクにも適しているでしょう。Javaの知識は必要なく、問題はまったく発生しません。この機能がなく、作成までに2年が経過した、ルート構築のルール作成の経験をお伝えします。
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
, , .
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;
}
機会があれば、タスクに、タグのチェックに基づいて2番目のオプションを使用します。これを優先することをお勧めします。これは、このアプローチに適合しない追加のロジックを混在させることを損なうものではありません。
がんばろう!