2013-11-30 3 views
3

После двух трудных дней, проходящих модульные тесты и фрагменты графического купе на GitHub и JavaDocs, думая, что я могу объединить все в очень простое приложение java, Я должен прийти к выводу, что я не могу :(Как быстро запустить графический кузнец с моим собственным графиком - Основы

Все, что я хочу сделать, это:

  1. построить график
  2. Init graphhopper и настроить его правильно
  3. нагрузкиграф
  4. Маршрут на это

Вот мой код до сих пор:

package javaapplication1; 

import com.graphhopper.*; 
import com.graphhopper.routing.util.EncodingManager; 
import com.graphhopper.storage.GraphBuilder; 
import com.graphhopper.storage.GraphStorage; 

public class JavaApplication1 { 

    protected static String location = "./tmp/graphstorage"; 
    protected static String defaultGraph = "./tmp/graphstorage/default"; 

    private static final EncodingManager encodingManager = new EncodingManager("CAR"); 

    public static GraphStorage createGraph() { 

     GraphStorage graph = new GraphBuilder(encodingManager).setLocation(location).create(); 
     graph.setNode(0, 42, 10); 
     graph.setNode(1, 42.1, 10.1); 
     graph.setNode(2, 42.1, 10.2); 
     graph.setNode(3, 42, 10.4); 
     graph.setNode(4, 41.9, 10.2); 

     graph.edge(0, 1, 10, true); 
     graph.edge(1, 2, 10, false); 
     graph.edge(2, 3, 10, true); 
     graph.edge(0, 4, 40, true); 
     graph.edge(4, 3, 40, true); 

     return graph; 
    } 

    public static void main(String[] args) { 

     double fromLat = 42; 
     double fromLon = 10.4; 
     double toLat = 42; 
     double toLon = 10; 

     GraphStorage gs = createGraph(); 

     GraphHopperAPI instance = new GraphHopper() 
      .setEncodingManager(encodingManager) 
      .setGraphHopperLocation(location) 
      .disableCHShortcuts(); 

     GraphHopper hopper = (GraphHopper) instance; 
     //hopper.setGraph(createGraph()); // protected because only for testing? 

     hopper.load(location); 

     GHResponse ph = hopper.route(new GHRequest(fromLat, fromLon, toLat, toLon)); 
     if(ph.isFound()) { 
      System.out.println(ph.getDistance()); 
      System.out.println(ph.getPoints().getSize()); 
     } else { 
      System.out.println("No Route found!"); 
     } 
    } 
} 

Java говорит: "Исключение в потоке "основного" java.lang.IllegalStateException: Вызов нагрузки или importOrLoad перед маршрутизацией ". Но я звоню .load() в бункер, который, к сожалению, возвращает «ложь», но я не могу понять, почему.

Моя цель для этой темы - предоставить очень простой пример рабочего кода компонентов GH и как подключить их для решения прецедента «Маршрут на графике, не загружаемом из OSM».

ответ

3

Если вы не хотите использовать OSM в качестве источника данных вы должны вариантов:

  1. Использование низкого уровня API с помощью копирования и вставки кода под GraphHopper.route. Нет необходимости повторно использовать класс GraphHopper. Но это, вероятно, сложнее.
  2. Сделайте MyGraphHopper extends GraphHopper и перегрузите необходимые методы. Убедитесь, что вы установили график до, вызывается метод postProcessing. Что, например, создает ярлыки и строит locationIndex.

КТО: В мастер GraphHopper.setGraph является общедоступным?

+0

ad 1. uhm ... ok, не думал об этом, но звучит очевидно. По крайней мере, анализ этого сегмента кода дал мне больше понимания работы графического процессора. –

+0

ad 2. В соответствии с 1. Я думаю, что я сделаю класс MyGraphHopper, который реализует интерфейс GraphHopperAPI (как компромисс), вишню, выбирающую некоторые сегменты кода из GraphHopper.java. Но тогда я думаю, что мне нужно знать, где определена «postProcessing»? И где он называется? –

+0

ad BTW: Сначала (как я это видел в модульном тесте, и он появился в завершении кода NB). Я думал, что .setGraph() является общедоступным ... Ура! Это то, что я искал ... нет! Почему нет такой функции, как эта публика? –