2014-03-05 2 views
0

GraphHopper를 사용하여 라우팅 용 API를 직접 만들고 싶습니다. 내 자신의 클래스를 만들려면 GraphHopper.java를 살펴 보았다. OSM 파일을 API에 넣었습니다. 가장자리, 노드 등이있는 디렉토리가 있습니다. 제대로 작동하는 것 같습니다.데스크톱 용 GraphHopper API 생성

제 질문은이 데이터를로드하여 route-Method를 호출 할 수 있습니까? GraphHopper.java 클래스를 이해하려고 시도하지만 예제가 작동하지 않습니다. 그래프를로드하려고합니다

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

라우팅을 위해 OSM 파일을 다시 필요로합니까, 아니면 가장자리와 노드가있는 디렉토리 만 사용할 수 있습니까? 는 이럴 나는 방법에 과부하 부하의 데이터를 코드로 위 경로를 호출 할 수 있습니다, 그래서 내 GraphHopperAPI 클래스를 만들 올바른지, 전화

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(); 

내 그래프를 만들 필요?

덕분에 많은 필

+0

나는 이것을 'Grace Hopper API' – Jherico

답변

0

당신은 한 번만 OSM 가져 오기를해야합니다. GraphHopper 클래스에서 새 저장소가 인스턴스화 된 다음 loadExisting이 호출됩니다. 실패하면 OSM 파일을 가져 와서 새로운 그래프 호퍼 파일을 만들어야합니다. 예 : 내 머리는이 비슷해야합니다

g = new LevelGraphStorage(dir, encodingManager); 
if(!g.loadExisting()) { 
    reader = new OSMReader(g).setLotsOfThings 
    reader.doOSM2Graph.. 
} 

문제는 당신이하지 않으면 당신은 단지 GraphHopperStorage을 사용할 수 있습니다 CH 있다는 것입니다. 그런 다음 올바른 위치에로드되거나 작성된 LocationIndex가 필요합니다. GraphHopper 래퍼 클래스 대신 원시 장치를 사용하는 기존 단위 테스트를 살펴보십시오.

하지만 GraphHopper의 하위 클래스를 만들고 기존 후크 (postprocessing, createWeighting, ...)를 사용하여 필요에 맞게 사용자 정의하지 않는 이유는 무엇입니까? 내가 작업 구조를 만들 수 없습니다

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(); 

:

0

은이 코드를 사용합니다. 테스트 예제를 살펴 보았습니다. 예를 들어 https://github.com/graphhopper/graphhopper/blob/master/core/src/test/java/com/graphhopper/GraphHopperAPITest.java이지만 loadGraph 메서드를 패키지 외부에서 호출 할 수 없습니다.

OSM 파일에서 올바른 그래프 데이터베이스를 만들고 싶습니다. 제대로 작동하는 것 같습니다. 내가 함께 지리적 위치에 가장 가까운 가장자리를 finde 싶습니다보다 :

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); 

와 그래프를 통해 빠른/최단 경로를 생성하고 싶습니다하지만 난 호출 경로-방법에 대한 작업 graphhopper 인스턴스를 만들 수 없습니다.