Todos os produtos
Search
Central de documentação

PolarDB:Modelo de caminho

Última atualização: Jun 28, 2026

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 cost que representa o peso da origem ao destino.

  • Grafos com custos e custos reversos: cada aresta também possui uma coluna reverse_cost que 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

id

Identificador único da aresta

source

Nó inicial da aresta

target

Nó final da aresta

cost

Peso da origem ao destino

Coluna adicional para um grafo com custos e custos reversos:

Coluna

Descrição

reverse_cost

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

id

integer

Obrigatório

Identificador único da aresta

source

integer

Obrigatório

Nó inicial

target

integer

Obrigatório

Nó final

cost

numeric

Obrigatório

Peso da origem ao destino

reverse_cost

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

x1

numeric

Obrigatório

Coordenada x do nó inicial

y1

numeric

Obrigatório

Coordenada y do nó inicial

x2

numeric

Obrigatório

Coordenada x do nó final

y2

numeric

Obrigatório

Coordenada y do nó final

Nota

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

path

integer array

Obrigatório

Sequência de IDs de arestas que formam um caminho proibido

cost

numeric

Obrigatório

Custo de percorrer o caminho proibido

Colunas do Points SQL:

Coluna

Tipo

Padrão

Descrição

pid

integer

Atribuído automaticamente

Identificador único do ponto

edge_id

integer

Obrigatório

Identificador da aresta mais próxima

fraction

numeric

Obrigatório

Posição relativa do ponto na aresta. Intervalo válido: 0–1.

side

char

b

Lado da aresta: b (ambos), r (direita), l (esquerda)

Colunas de resultado

Resultados de caminho — retornados por funções de caminho único:

Coluna

Tipo

Descrição

seq

integer

Posição sequencial começando em 1

path_seq

integer

Posição relativa dentro do caminho, começando em 1

[start_vid]

bigint

ID do vértice inicial. Retornado apenas quando a consulta possui múltiplos vértices iniciais.

[end_vid]

bigint

ID do vértice final. Retornado apenas quando a consulta possui múltiplos vértices finais.

node

bigint

Identificador do nó no caminho de start_vid até end_vid

edge

bigint

Identificador da aresta do nó atual para o próximo nó. -1 indica o último nó.

cost

float

Custo do nó atual para o próximo

agg_cost

float

Custo total de start_vid até o nó atual

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: 0 para 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

seq

integer

Posição sequencial começando em 1

path_id

integer

Identificador do caminho. O primeiro caminho de start_vid para end_vid tem ID 1.

path_seq

integer

Posição relativa dentro do caminho, começando em 1

[start_vid]

bigint

ID do vértice inicial. Retornado apenas quando a consulta possui múltiplos vértices finais.

[end_vid]

bigint

ID do vértice final. Retornado apenas quando a consulta possui múltiplos vértices finais.

node

bigint

Identificador do nó no caminho

edge

bigint

Identificador da aresta. -1 indica o último nó.

cost

float

Custo do nó atual para o próximo

agg_cost

float

Custo total de start_vid até o nó atual

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

start_vid

bigint

ID do vértice inicial

end_vid

bigint

ID do vértice final

agg_cost

float

Custo total de start_vid até end_vid

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

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.