0

GraphHopper を使用して、ルーティング用の独自の API を作成したいと考えています。GraphHopper.java を調べて、独自のクラスを作成しました。OSM ファイルを API に入れ、エッジ、ノードなどを含むディレクトリを取得しました。これはうまく機能しているようです。

私の質問は、ルート メソッドを呼び出すことができるように、このデータをどのようにロードできるかということです。GraphHopper.java クラスを理解しようとしていますが、私の例は機能しません。グラフをロードしようとしました

GHDirectory l_dir = new GHDirectory( m_graphlocation.getAbsolutePath(), DAType.RAM);
m_graph = new LevelGraphStorage( l_dir, m_EncodingManager );

ルーティングのために OSM ファイルが再び必要ですか、それともエッジとノードのみでディレクトリを使用できますか? IMHO 電話が必要です

OSMReader l_reader = new OSMReader( l_graph, CConfiguration.getInstance().get().ExpectedCapacity).setWorkerThreads(-1).setEncodingManager(m_EncodingManager).setWayPointMaxDistance(CConfiguration.getInstance().get().WaypointMaxDistance).setEnableInstructions(false);
l_reader.doOSM2Graph(p_osm);
l_graph.optimize();

グラフを作成するには、GraphHopperAPI クラスを作成し、メソッドをオーバーロードし、上記のコードでデータをロードして、ルートを呼び出すことができますか?

どうもありがとうフィル

4

2 に答える 2

0

私はこのコードを使用します:

GHDirectory l_dir    = new GHDirectory( l_graphlocation.getAbsolutePath(), DAType.RAM_STORE);
m_graph              = new LevelGraphStorage( l_dir, m_EncodingManager );

m_graph.setSegmentSize( CConfiguration.getInstance().get().SegmentSize );

if (!m_graph.loadExisting())
{
    File l_osm = this.downloadOSMData();

    OSMReader l_reader = new OSMReader( m_graph, CConfiguration.getInstance().get().ExpectedCapacity).setWorkerThreads(-1).setEncodingManager(m_EncodingManager).setWayPointMaxDistance(CConfiguration.getInstance().get().WaypointMaxDistance).setEnableInstructions(false);
    l_reader.doOSM2Graph(l_osm);

    m_graph.optimize();
    m_graph.flush();

    // do I need this?
    PrepareRoutingSubnetworks l_preparation = new PrepareRoutingSubnetworks(m_graph, m_EncodingManager);
    l_preparation.setMinNetworkSize( CConfiguration.getInstance().get().MinNetworkSize );
    l_preparation.doWork();
}

// is this correct?
m_index = new LocationIndexTree(m_graph, l_dir);
m_index.setResolution( CConfiguration.getInstance().get().IndexResolution );
m_index.setSearchRegion(true);
if (!m_index.loadExisting())
    throw new IOException("unable to load graph index file");

// does not work without the graph
m_graphhopper = new GraphHopper().setEncodingManager(m_EncodingManager).forDesktop();

作業構造を作成できません。https://github.com/graphhopper/graphhopper/blob/master/core/src/test/java/com/graphhopper/GraphHopperAPITest.javaなどのテスト例を調べましたが、loadGraph メソッドはパッケージ。

OSM ファイルから正しいグラフ データベースを作成したいのですが、これは機能しているようです。次の方法で地理的位置に最も近いエッジを見つけたいと思います。

m_index.findClosest( p_position.getLatitude(), p_position.getLongitude(), EdgeFilter.ALL_EDGES );

しかし、これはヌルポインタ例外を返すので、私のインデックスは間違っているはずです。正しい作業インデックスを作成するにはどうすればよいですか?

この後、グラフを介して高速/最短ルートを作成したいと思います

GHRequest l_request = new GHRequest( p_start.getLatitude(), p_start.getLongitude(), p_end.getLatitude(), p_end.getLongitude() );
l_request.setAlgorithm( CConfiguration.getInstance().get().RoutingAlgorithm );

return m_graphhopper.route(l_request);

しかし、ルートメソッドを呼び出すための作業用グラフホッパーインスタンスを作成できません。

于 2014-03-07T09:23:06.070 に答える