Estou construindo um sistema de planejamento de rota, mas ainda tenho que decidir qual mecanismo de roteamento subjacente vou usar. Até agora eu encontrei pgrouting e neo4j.
Eu tenho minha rede de rotas em um banco de dados postgresql / postgis (importado de um shapefile). Fiz consultas para extrair nós (pontos finais de maneiras em que você deve tomar uma decisão em que direção seguir ou sem saída) e para extrair arestas (geralmente compostas por várias maneiras consecutivas). Todas as minhas arestas são bidirecionais.
Meu principal objetivo é calcular rotas nesta rede usando um algoritmo A-star em que distance = cost.
Meu sentimento me diz que um banco de dados de gráficos como o neo4j é o caminho a seguir (como parece ser feito para esse fim), mas eles não parecem suportar a estrela A por padrão e também não há um senso real de geometria . Parece mais adequado para redes sociais em vez de mapas.
- O pgrouting atenderia minhas necessidades?
- É rápido o suficiente para consultas dinâmicas (+ -2000 nós, + -4000 arestas)? Normalmente, isso seria alguns ms para a estrela A, mas não tenho certeza sobre essa implementação no sql.
- O pgrouting A-star me fornece uma lista de nós e arestas?
- Na maioria dos exemplos que vejo sobre pgrouting, noto que geralmente existe uma lista de comandos após o cálculo da rota (como "No X, vire à esquerda, etc"). O pgrouting produz isso ou é de outro sistema?
Espero que alguém possa me dar algumas informações sobre qual sistema escolher. Neo4j, pgrouting ou algum outro sistema.
Respostas:
Atualmente, estou explorando o mesmo problema que você, para fins de trabalho de pesquisa. Antes de começar a testar esses dois bancos de dados, eu tinha a mesma presunção que você. Esse banco de dados de gráficos Neo4j seria a solução perfeita para esse tipo de problema. E parcialmente é, mas com muitos problemas.
O primeiro problema é que o A-Star será implementado apenas se você estiver usando um banco de dados incorporado, não pela API REST (servidor). Se você deseja usar o Neo4j com a API REST, apenas o algoritmo Dijkstra é suportado. O segundo problema são os requisitos de memória de hardware para o Neo4j. Para roteamento (Dijkstra) em redes "maiores", você precisa de muita RAM. Para rede grande, quero dizer algo como o tamanho do banco de dados rodoviário da Alemanha OSM . Eu executei meus testes no servidor de 6 GB de RAM (é tudo o que tenho atualmente) e apenas redes menores podem ser roteadas sem erros de exceção OutOfMemory. Redes "pequenas" em meus casos de teste são, por exemplo, banco de dados de estradas OSM para Áustria ou Croácia. Consultas simultâneas ainda não testei com o Neo4j.
Todos esses problemas não existem no pgRouting. A memória não é um problema, mas as consultas simultâneas aumentam a quantidade necessária de memória. Por exemplo, se você tiver duas solicitações simultâneas, será necessária uma quantidade dupla de memória. Isso não foi um problema, mesmo para um conjunto de dados OSM da Alemanha, o pgRouting roteado sem problemas para todas as solicitações simultâneas.
Desempenho: Na maioria dos casos, o Neo4j supera o pgRouting. Mas apenas se houver memória suficiente para o conjunto de dados fornecido e se todos os nós e relacionamentos estiverem na memória (hot start). O aumento / diminuição do desempenho depende de muitos fatores, mas principalmente do tamanho da rede e da distância (saltos) entre o nó de origem e o destino.
O tamanho da sua rede é muito pequeno, portanto você não deve ter problemas com a memória. Provavelmente, o Neo4j não é uma má escolha, mas você precisa se adaptar a um "pequeno" modelo de dados diferente dos bancos de dados de relações padrão.
Para responder às suas perguntas:
Não sei se o ajudará diretamente, mas um dos servidores de roteamento mais rápido que encontrei é o osm2po . Funciona com o conjunto de dados OSM e é bastante rápido. Atualmente, dijkstra está implementado, mas o desenvolvedor também anunciou a AStar. Espero que isso ajude você. :)
fonte
Você também pode dar uma olhada no nosso pacote RW Net 4 (www.routeware.dk). Ele pode fazer cálculos de caminho mais curto usando A * diretamente de um arquivo SHP. O pacote básico de € 500 parece suficiente para suas necessidades.
fonte