O GanosBase Networking é uma extensão de mecanismo espaço-temporal para o PolarDB for PostgreSQL que oferece roteamento geoespacial e análise de redes. Ele modela redes viárias e de tráfego como grafos compostos por arestas e nós, encontrando o caminho mais curto, mais rápido ou ideal com base em um modelo de custo. O GanosBase Networking é totalmente compatível com o pgRouting, permitindo migrar aplicações existentes sem alterações.
Casos de uso
Planejamento de rotas: calcule o caminho mais curto ou mais rápido entre dois pontos para serviços de logística, entregas e transporte por aplicativo. Em redes não geográficas, como conexões de nós de internet, use o GanosBase Networking para analisar a topologia da rede.
Análise geoespacial: analise redes viárias para buscar vizinhos mais próximos e definir áreas de serviço, compreendendo a distribuição e as relações dos dados geoespaciais.
Gestão de fluxo de tráfego: analise o volume de tráfego, preveja congestionamentos e gere recomendações de otimização para a gestão do tráfego urbano e sistemas inteligentes de transporte (ITS).
Conceitos principais
Grafos
Um grafo é um par ordenado G = (V, E), onde:
Vé um conjunto de vértices (também chamados de nós).E ⊆ {(u, v) | u, v ∈ V}é um conjunto de arestas que conectam esses vértices.
Os tipos de grafo incluem grafos não direcionados, grafos simples não direcionados, grafos direcionados e grafos simples direcionados. No GanosBase Networking, os grafos são armazenados no banco de dados das seguintes formas:
Grafos com custos: cada aresta possui uma coluna
costque representa o peso da origem ao destino.Grafos com custos e custos reversos: cada aresta também possui uma coluna
reverse_costque representa o peso na direção oposta.
Ambos os tipos de grafo podem ser tratados como direcionados ou não direcionados durante o cálculo.
Colunas para um grafo com custos:
|
Coluna |
Descrição |
|
|
Identificador único da aresta |
|
|
Nó inicial da aresta |
|
|
Nó final da aresta |
|
|
Peso da origem ao destino |
Coluna adicional para um grafo com custos e custos reversos:
|
Coluna |
Descrição |
|
|
Peso do destino à origem |
Algoritmos suportados
O GanosBase Networking suporta 13 algoritmos para análise de caminhos e de redes:
Algoritmo de Johnson
Algoritmo de Floyd-Warshall
Algoritmo A / algoritmo A bidirecional
Algoritmo de Dijkstra / algoritmo de Dijkstra bidirecional
Algoritmo do caixeiro-viajante
Algoritmo de Prim
Algoritmo de Kruskal
Algoritmo de K caminhos mais curtos
Análise de fluxo
Operações de topologia
Operações de componentes
Contrações
Algoritmo de Caminho Mais Curto com Restrição de Conversão (TRSP)
Alguns algoritmos também aceitam um custo ou matriz de custos para cálculo.
Estrutura das funções
Todas as funções do GanosBase Networking seguem a assinatura de função do pgRouting:
pgr_<name>(inner_queries, parameters, [optional_parameters])
inner_queries: instruções SQL que definem os dados do grafo consumidos pela função.
parameters: entradas obrigatórias para a função.
optional_parameters: entradas opcionais; cada uma possui um valor padrão quando omitida.
Cada função suporta uma ou mais destas sobrecargas:
|
Sobrecarga |
Descrição |
|
Um para um |
Um nó inicial para um nó final |
|
Um para muitos |
Um nó inicial para vários nós finais |
|
Muitos para um |
Vários nós iniciais para um nó final |
|
Muitos para muitos |
Vários nós iniciais para vários nós finais |
|
Combinação |
Vários pares início-fim especificados como tuplas |
Tipos de consulta interna
As consultas internas passam os dados do grafo para a função de roteamento. O tipo necessário depende do algoritmo.
|
Tipo de consulta interna |
Algoritmos aplicáveis |
|
General Edge SQL |
Dijkstra ou Dijkstra bidirecional |
|
General Edge SQL sem ID |
Todos os pares (Floyd-Warshall, Johnson) |
|
General Edge SQL com x e y |
A, A bidirecional |
|
Combinations SQL |
Sobrecargas de combinação para qualquer algoritmo |
|
Restrictions SQL |
Caminho Mais Curto com Restrição de Conversão (TRSP) |
|
Points SQL |
pgr_withPoints |
Colunas do General Edge SQL:
|
Coluna |
Tipo |
Padrão |
Descrição |
|
|
integer |
Obrigatório |
Identificador único da aresta |
|
|
integer |
Obrigatório |
Nó inicial |
|
|
integer |
Obrigatório |
Nó final |
|
|
numeric |
Obrigatório |
Peso da origem ao destino |
|
|
numeric |
-1 |
Peso do destino à origem. Um valor negativo indica que a aresta (destino → origem) não faz parte do grafo. |
General Edge SQL sem ID — mesmas colunas acima, mas omitindo id.
General Edge SQL com x e y — mesmas colunas do General Edge SQL (sem id), com quatro colunas adicionais:
|
Coluna |
Tipo |
Padrão |
Descrição |
|
|
numeric |
Obrigatório |
Coordenada x do nó inicial |
|
|
numeric |
Obrigatório |
Coordenada y do nó inicial |
|
|
numeric |
Obrigatório |
Coordenada x do nó final |
|
|
numeric |
Obrigatório |
Coordenada y do nó final |
Nesta variante, um valor negativo de cost significa que a aresta (origem → destino) não faz parte do grafo.
Colunas do Restrictions SQL:
|
Coluna |
Tipo |
Padrão |
Descrição |
|
|
integer array |
Obrigatório |
Sequência de IDs de arestas que formam um caminho proibido |
|
|
numeric |
Obrigatório |
Custo de percorrer o caminho proibido |
Colunas do Points SQL:
|
Coluna |
Tipo |
Padrão |
Descrição |
|
|
integer |
Atribuído automaticamente |
Identificador único do ponto |
|
|
integer |
Obrigatório |
Identificador da aresta mais próxima |
|
|
numeric |
Obrigatório |
Posição relativa do ponto na aresta. Intervalo válido: 0–1. |
|
|
char |
|
Lado da aresta: |
Colunas de resultado
Resultados de caminho — retornados por funções de caminho único:
|
Coluna |
Tipo |
Descrição |
|
|
integer |
Posição sequencial começando em 1 |
|
|
integer |
Posição relativa dentro do caminho, começando em 1 |
|
|
bigint |
ID do vértice inicial. Retornado apenas quando a consulta possui múltiplos vértices iniciais. |
|
|
bigint |
ID do vértice final. Retornado apenas quando a consulta possui múltiplos vértices finais. |
|
|
bigint |
Identificador do nó no caminho de |
|
|
bigint |
Identificador da aresta do nó atual para o próximo nó. |
|
|
float |
Custo do nó atual para o próximo |
|
|
float |
Custo total de |
A função pgr_withPoints retorna as mesmas colunas com as seguintes diferenças:
[start_vid]: positivo = ID do vértice inicial; negativo = ID do vértice final.[end_vid]: positivo = ID do vértice final; negativo = ID do vértice inicial.node: positivo = ID do vértice; negativo = ID do ponto.agg_cost:0para o primeiro registro do caminho.
A função pgr_dijkstraNear sempre retorna start_vid e end_vid (independentemente do tipo de consulta).
Resultados de múltiplos caminhos — retornados por funções que encontram vários caminhos:
Para funções seletivas:
|
Coluna |
Tipo |
Descrição |
|
|
integer |
Posição sequencial começando em 1 |
|
|
integer |
Identificador do caminho. O primeiro caminho de |
|
|
integer |
Posição relativa dentro do caminho, começando em 1 |
|
|
bigint |
ID do vértice inicial. Retornado apenas quando a consulta possui múltiplos vértices finais. |
|
|
bigint |
ID do vértice final. Retornado apenas quando a consulta possui múltiplos vértices finais. |
|
|
bigint |
Identificador do nó no caminho |
|
|
bigint |
Identificador da aresta. |
|
|
float |
Custo do nó atual para o próximo |
|
|
float |
Custo total de |
Para funções não seletivas, start_vid e end_vid são sempre retornados (sem colchetes).
Resultados de função de custo — retornados por funções de custo e matriz de custos:
|
Coluna |
Tipo |
Descrição |
|
|
bigint |
ID do vértice inicial |
|
|
bigint |
ID do vértice final |
|
|
float |
Custo total de |
Início rápido
Esta seção apresenta um exemplo completo: instalação da extensão, criação de um grafo de rede viária e execução de três tipos de consultas de caminho.
A rede de exemplo possui 18 arestas conectando nós posicionados em coordenadas (x, y) em uma grade. O objetivo é encontrar caminhos entre nós usando três algoritmos diferentes — Dijkstra (nó 2 para 3), A* (nó 2 para 12) e TRSP com restrições de conversão (nó 2 para 7) — e observar como a escolha do algoritmo e o formato da consulta interna afetam o resultado.
Etapa 1: Instale a extensão
CREATE EXTENSION Ganos_Networking WITH SCHEMA public CASCADE;
Instale a extensão no schema public para evitar problemas de permissão.
Etapa 2: Crie a tabela de arestas
CREATE TABLE edge_table (
id BIGSERIAL,
dir CHARACTER VARYING,
source BIGINT,
target BIGINT,
cost FLOAT,
reverse_cost FLOAT,
capacity BIGINT,
reverse_capacity BIGINT,
category_id INTEGER,
reverse_category_id INTEGER,
x1 FLOAT,
y1 FLOAT,
x2 FLOAT,
y2 FLOAT,
the_geom GEOMETRY
);
Etapa 3: Inserir arestas
INSERT INTO edge_table (
category_id, reverse_category_id,
cost, reverse_cost,
capacity, reverse_capacity,
x1, y1,
x2, y2) VALUES
(3, 1, 1, 1, 80, 130, 2, 0, 2, 1),
(3, 2, -1, 1, -1, 100, 2, 1, 3, 1),
(2, 1, -1, 1, -1, 130, 3, 1, 4, 1),
(2, 4, 1, 1, 100, 50, 2, 1, 2, 2),
(1, 4, 1, -1, 130, -1, 3, 1, 3, 2),
(4, 2, 1, 1, 50, 100, 0, 2, 1, 2),
(4, 1, 1, 1, 50, 130, 1, 2, 2, 2),
(2, 1, 1, 1, 100, 130, 2, 2, 3, 2),
(1, 3, 1, 1, 130, 80, 3, 2, 4, 2),
(1, 4, 1, 1, 130, 50, 2, 2, 2, 3),
(1, 2, 1, -1, 130, -1, 3, 2, 3, 3),
(2, 3, 1, -1, 100, -1, 2, 3, 3, 3),
(2, 4, 1, -1, 100, -1, 3, 3, 4, 3),
(3, 1, 1, 1, 80, 130, 2, 3, 2, 4),
(3, 4, 1, 1, 80, 50, 4, 2, 4, 3),
(3, 3, 1, 1, 80, 80, 4, 1, 4, 2),
(1, 2, 1, 1, 130, 100, 0.5, 3.5, 1.999999999999, 3.5),
(4, 1, 1, 1, 50, 130, 3.5, 2.3, 3.5, 4);
Etapa 4: Defina geometria e direção das arestas
UPDATE edge_table
SET the_geom = ST_MakeLine(ST_Point(x1, y1), ST_Point(x2, y2)),
dir = CASE
WHEN (cost > 0 AND reverse_cost > 0) THEN 'B' -- bidirectional
WHEN (cost > 0 AND reverse_cost < 0) THEN 'FT' -- forward only
WHEN (cost < 0 AND reverse_cost > 0) THEN 'TF' -- reverse only
ELSE ''
END;
Etapa 5: Construir a topologia
SELECT pgr_createTopology('edge_table', 0.001);
Etapa 6: Execute consultas de caminho
Todos os três exemplos abaixo encontram um caminho no mesmo grafo. Eles diferem no algoritmo e, consequentemente, no caminho encontrado e nas colunas de consulta interna necessárias.
Algoritmo de Dijkstra — caminho mais curto do nó 2 ao nó 3:
SELECT * FROM pgr_dijkstra(
'SELECT id, source, target, cost, reverse_cost FROM edge_table',
2, 3
);
seq | path_seq | node | edge | cost | agg_cost
-----+----------+------+------+------+----------
1 | 1 | 2 | 4 | 1 | 0
2 | 2 | 5 | 8 | 1 | 1
3 | 3 | 6 | 9 | 1 | 2
4 | 4 | 9 | 16 | 1 | 3
5 | 5 | 4 | 3 | 1 | 4
6 | 6 | 3 | -1 | 0 | 5
(6 rows)
Algoritmo A* — caminho mais curto do nó 2 ao nó 12 (requer coordenadas x, y; executa como não direcionado com heurística 2):
SELECT * FROM pgr_astar(
'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table',
2, 12,
directed := false, heuristic := 2
);
seq | path_seq | node | edge | cost | agg_cost
-----+----------+------+------+------+----------
1 | 1 | 2 | 2 | 1 | 0
2 | 2 | 3 | 3 | 1 | 1
3 | 3 | 4 | 16 | 1 | 2
4 | 4 | 9 | 15 | 1 | 3
5 | 5 | 12 | -1 | 0 | 4
(5 rows)
Algoritmo de Caminho Mais Curto com Restrição de Conversão (TRSP) — caminho mais curto do nó 2 ao nó 7 com restrições de conversão:
SELECT * FROM pgr_trsp(
'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost FROM edge_table',
2, 7, false, false,
'SELECT to_cost, target_id::int4,
from_edge || COALESCE('','' || via_path, '''') AS via_path
FROM restrictions'
);
seq | id1 | id2 | cost
-----+-----+-----+------
0 | 2 | 4 | 1
1 | 5 | 10 | 1
2 | 10 | 12 | 1
3 | 11 | 11 | 1
4 | 6 | 8 | 1
5 | 5 | 7 | 1
6 | 8 | 6 | 1
7 | 7 | -1 | 0
(8 rows)
Etapa 7: Remover a extensão (opcional)
DROP EXTENSION Ganos_Networking CASCADE;
Próximos passos
Para obter a lista completa de funções suportadas e sintaxe SQL, consulte a documentação do pgRouting.