Todos os produtos
Search
Central de documentação

PolarDB:Modelo de caminho

Última atualização: Aug 24, 2026

Este tópico descreve a finalidade, os componentes básicos e um guia de início rápido do modelo de caminho.

Finalidade do modelo

Introdução

O modelo de caminho é uma estrutura de grafo composta por pontos e arestas. Ele resolve problemas como planejamento de rotas em redes viárias, navegação GPS para mapas eletrônicos e roteamento. Esse modelo é totalmente compatível com as interfaces do PGRouting e permite a migração tranquila de aplicações existentes. Os dados de caminho formam um grafo de rede geométrica de arestas e nós, utilizado principalmente para construir redes rodoviárias e de tráfego.

GanosBase Networking é uma extensão de engine espaço-temporal para PolarDB for PostgreSQL. A extensão Networking fornece funções e stored procedures para encontrar o caminho mais rápido, mais curto ou ideal com base em um modelo de custo. Ela oferece recursos de roteamento geoespacial e suporta diversos algoritmos de análise de caminhos e redes, adicionando capacidades de análise de rotas e redes ao banco de dados.

Visão geral das funções

GanosBase Networking oferece uma série de funções para planejamento de rotas e análise de redes:

  • Algoritmo de Johnson.

  • Algoritmo Floyd-Warshall.

  • Algoritmos de caminho mais curto A e A bidirecional.

  • Algoritmos de caminho mais curto Dijkstra e 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 de grafo.

  • Operações de componentes de grafo.

  • Contração de grafo.

  • Algoritmo de Caminho Mais Curto com Restrição de Conversão (TRSP).

Algumas funções também suportam cálculos usando um custo ou uma matriz de custos.

Principais cenários de negócios

GanosBase Networking atende a uma ampla variedade de cenários:

  • Planejamento de rota ideal

    Em setores como logística, entregas expressas e serviços de táxi, utilize o GanosBase Networking para calcular o caminho mais curto ou mais rápido entre dois pontos, otimizando o planejamento de rotas. Para caminhos não geográficos, como conexões entre nós da Internet, o GanosBase Networking também auxilia na identificação de uma topologia de rede ideal.

  • Análise geoespacial

    Utilize o GanosBase Networking para executar análises baseadas em redes viárias, como buscas de vizinhos mais próximos e análise de áreas de service. Essas análises ajudam a compreender a distribuição e as relações dos dados geoespaciais, melhorando a tomada de decisão e o planejamento.

  • Gestão de fluxo de tráfego

    Combine o GanosBase Networking com dados de fluxo de tráfego para analisar o trânsito, prever congestionamentos e obter sugestões de otimização. Essa funcionalidade é valiosa para aplicações como gestão de tráfego urbano e sistemas inteligentes de transporte.

Componentes básicos

Conceito de grafo

Um grafo é um par ordenado representado pela fórmula G = (V, E), onde:

  • V representa o conjunto de vértices do grafo. Os elementos em V são chamados de vértices ou nós.

  • E ⊆ {( u, v ) | u , v ∈ V }.

Existem vários tipos de grafos, como grafos não direcionados, grafos simples não direcionados, grafos direcionados e grafos simples direcionados.

No GanosBase, há duas formas de representar um grafo:

  • Grafo de custo.

  • Grafo de custo direto e reverso.

Ao executar cálculos, especifique qualquer um desses tipos de grafo como direcionado ou não direcionado.

Grafo de custo

Um grafo de custo possui a seguinte estrutura no banco de dados:

Coluna

Descrição

id

O identificador exclusivo da aresta.

source

O ponto inicial da aresta.

target

O ponto final da aresta.

cost

O peso (custo) da aresta do ponto inicial ao ponto final.

Grafo de custo direto e reverso

Um grafo de custo direto e reverso possui a seguinte estrutura no banco de dados:

Nome da Coluna

Descrição

id

O identificador exclusivo da aresta.

source

O ponto inicial da aresta.

target

O ponto final da aresta.

cost

O peso (custo) da aresta do ponto inicial ao ponto final.

reverse_cost

O peso (custo) da aresta do ponto final ao ponto inicial.

Estrutura do corpo da função

GanosBase Networking é compatível com o padrão pgRouting. A estrutura geral de uma função é:

pgr_<name>(Inner_queries, Parameters, [ Optional_parameters ])

Onde:

  • Inner_queries: Uma consulta interna. Este parâmetro é uma string SQL usada para construir os dados necessários à função.

  • Parameters: Os parâmetros obrigatórios exigidos pela função.

  • Optional_parameters: Os parâmetros opcionais. Estes parâmetros possuem valores padrão e podem ser omitidos.

Uma função pode ter diferentes sobrecargas. As sobrecargas comuns incluem:

  • Um para um: Navega de um ponto inicial para um ponto final.

  • Um para muitos: Navega de um ponto inicial para múltiplos pontos finais.

  • Muitos para um: Navega de múltiplos pontos iniciais para um ponto final.

  • Muitos para muitos: Navega de múltiplos pontos iniciais para múltiplos pontos finais.

  • Combinação: Navega de múltiplos pontos iniciais distintos para múltiplos pontos finais distintos. Cada tupla especifica um par de pontos iniciais e finais.

Estruturas de dados para consultas internas

Para passar uma estrutura de grafo a um modelo de função, construa uma consulta interna. Essas consultas são categorizadas por tipo de solicitação da seguinte forma:

  • Edge SQL.

  • Consulta geral de arestas: Aplica-se aos algoritmos de caminho mais curto Dijkstra e Dijkstra bidirecional.

  • Consulta geral de arestas sem ID: Aplica-se aos algoritmos All Pairs.

  • Consulta geral de arestas com valores X/Y: Aplica-se aos algoritmos de caminho mais curto A e A bidirecional.

  • Combinations SQL.

  • Restrictions SQL.

  • Points SQL.

Consulta geral de arestas

Coluna

Tipo

Padrão

Descrição

id

integer

Nenhum

O identificador exclusivo da aresta.

source

integer

Nenhum

O ponto inicial da aresta.

target

integer

Nenhum

O ponto final da aresta.

cost

numeric

Nenhum

O peso da aresta.

reverse_cost

numeric

-1

O peso da aresta do ponto final ao ponto inicial.

Se o valor for negativo, a aresta \((target \rightarrow source)\) não existe no grafo.

Consulta de arestas sem ID

Coluna

Tipo

Padrão

Descrição

source

integer

Nenhum

O ponto inicial da aresta.

target

integer

Nenhum

O ponto final da aresta.

cost

numeric

Nenhum

O peso da aresta.

reverse_cost

numeric

-1

O peso da aresta do ponto final ao ponto inicial.

Se o valor for negativo, a aresta \((target \rightarrow source)\) não existe no grafo.

Consulta de arestas com valores X/Y

Coluna

Tipo

Padrão

Descrição

source

integer

Nenhum

O ponto inicial da aresta.

target

integer

Nenhum

O ponto final da aresta.

cost

numeric

Nenhum

O peso da aresta.

Se o valor for negativo, a aresta \((source \rightarrow target)\) não existe no grafo.

reverse_cost

numeric

-1

O peso da aresta do ponto final ao ponto inicial.

Se o valor for negativo, a aresta \((target \rightarrow source)\) não existe no grafo.

x1

numeric

Nenhum

A coordenada X do ponto inicial da aresta.

y1

numeric

Nenhum

A coordenada Y do ponto inicial da aresta.

x2

numeric

Nenhum

A coordenada X do ponto final da aresta.

y2

numeric

Nenhum

A coordenada Y do ponto final da aresta.

Consulta de restrições

Coluna

Tipo

Padrão

Descrição

path

integer array

Nenhum

Uma sequência de IDs para todas as arestas intransponíveis.

cost

numeric

Nenhum

O custo para atravessar as arestas intransponíveis.

Consulta de pontos

Coluna

Tipo

Padrão

Descrição

pid

integer

valor automático

O identificador exclusivo do ponto.

edge_id

integer

Nenhum

O identificador exclusivo da aresta mais próxima do ponto.

fraction

numeric

Nenhum

A posição relativa do ponto na aresta. O valor deve estar entre 0 e 1.

side

char

b

A posição do ponto atual. O valor deve ser um dos seguintes: b (ambos), r (direita) ou l (esquerda). Se o valor for NULL, ele será tratado como b.

Estruturas de dados das colunas de resultado

As colunas retornadas variam dependendo da função.

Resultado para um único caminho

Coluna

Tipo

Descrição

seq

integer

Um valor sequencial que começa em 1.

path_seq

integer

A posição relativa no caminho completo. É um valor sequencial que começa em 1.

[start_vid]

big integer

O identificador exclusivo do vértice inicial. Esta coluna é retornada apenas quando a consulta possui múltiplos vértices iniciais.

[end_vid]

big integer

O identificador exclusivo do vértice final. Esta coluna é retornada apenas quando a consulta possui múltiplos vértices finais.

node

big integer

O identificador do nó no caminho de "start_vid" até "end_vid".

edge

big integer

O identificador da aresta do nó atual para o próximo nó na sequência do caminho. Um valor de -1 indica o último nó do caminho.

cost

float

O custo do nó atual para o próximo nó na sequência do caminho.

agg_cost

float

O custo total de "start_vid" até "node".

Aplica-se à função pgr_withPoints:

Coluna

Tipo

Descrição

seq

integer

Um valor sequencial que começa em 1.

path_seq

integer

A posição relativa no caminho completo. É um valor sequencial que começa em 1.

[start_vid]

big integer

O identificador exclusivo do vértice ou ponto inicial. Esta coluna é retornada apenas quando a consulta possui múltiplos vértices iniciais.

  • Um valor positivo é o identificador de um vértice inicial.

  • Um valor negativo é o identificador de um ponto inicial.

[end_vid]

big integer

O identificador exclusivo do vértice ou ponto final é retornado apenas quando a consulta contém múltiplos vértices iniciais.

  • Um valor positivo é o identificador de um vértice final.

  • Um valor negativo é o identificador de um ponto final.

node

big integer

O identificador do nó no caminho de "start_vid" até "end_vid".

  • Um valor positivo é o identificador de um vértice.

  • Um valor negativo é o identificador de um ponto.

edge

big integer

O identificador da aresta do nó atual para o próximo nó na sequência do caminho. Um valor de -1 indica o último nó do caminho.

cost

float

O custo do nó atual para o próximo nó na sequência do caminho.

agg_cost

float

O custo total de "start_vid" até "node". Um valor de 0 indica o primeiro registro do caminho.

Aplica-se à função pgr_dijkstraNear:

Coluna

Tipo

Descrição

seq

integer

Um valor sequencial que começa em 1.

path_seq

integer

A posição relativa no caminho completo. É um valor sequencial que começa em 1.

start_vid

big integer

O identificador exclusivo do vértice inicial do caminho atual.

end_vid

big integer

O identificador exclusivo do vértice final do caminho atual.

node

big integer

O identificador do nó no caminho de "start_vid" até "end_vid".

edge

big integer

O identificador da aresta do nó atual para o próximo nó na sequência do caminho. Um valor de -1 indica o último nó do caminho.

cost

float

O custo do nó atual para o próximo nó na sequência do caminho.

agg_cost

float

O custo total de "start_vid" até "node".

Resultado para múltiplos caminhos

Aplica-se a funções seletivas para múltiplos caminhos:

Coluna

Tipo

Descrição

seq

integer

Um valor sequencial que começa em 1.

path_id

integer

O identificador exclusivo do caminho.

O ID do primeiro caminho de "start_vid" até "end_vid" é 1.

path_seq

integer

A posição relativa no caminho completo. É um valor sequencial que começa em 1.

[start_vid]

big integer

O identificador exclusivo do vértice inicial. Esta coluna é retornada apenas quando a consulta possui múltiplos vértices iniciais.

[end_vid]

big integer

O identificador exclusivo do vértice final. Esta coluna é retornada apenas quando a consulta possui múltiplos vértices finais.

node

big integer

O identificador do nó no caminho de "start_vid" até "end_vid".

edge

big integer

O identificador da aresta do nó atual para o próximo nó na sequência do caminho. Um valor de -1 indica o último nó do caminho.

cost

float

O custo do nó atual para o próximo nó na sequência do caminho.

agg_cost

float

O custo total de "start_vid" até "node".

Aplica-se a funções não seletivas para múltiplos caminhos:

Coluna

Tipo

Descrição

seq

integer

Um valor sequencial que começa em 1.

path_id

integer

O identificador exclusivo do caminho.

O ID do primeiro caminho de "start_vid" até "end_vid" é 1.

path_seq

integer

A posição relativa no caminho completo. É um valor sequencial que começa em 1.

start_vid

big integer

O identificador exclusivo do vértice inicial.

end_vid

big integer

O identificador exclusivo do vértice final.

node

big integer

O identificador do nó no caminho de "start_vid" até "end_vid".

edge

big integer

O identificador da aresta do nó atual para o próximo nó na sequência do caminho. Um valor de -1 indica o último nó do caminho.

cost

float

O custo do nó atual para o próximo nó na sequência do caminho.

agg_cost

float

O custo total de "start_vid" até "node".

Resultado para funções de custo

Aplica-se a funções que utilizam um custo ou matriz de custos:

Nome da Coluna

Tipo

Descrição

start_vid

big integer

O identificador exclusivo do vértice inicial.

end_vid

big integer

O identificador exclusivo do vértice final.

agg_cost

float

O custo total do caminho de "start_vid" até "end_vid".

Início Rápido

Introdução

Este guia de início rápido descreve o uso básico da engine GanosBase Networking, incluindo como crie uma extensão, crie uma tabela, inserir dados, atualize propriedades, crie uma topologia e consultar caminhos.

Descrição da sintaxe

  • Crie a extensão.

     CREATE Extension Ganos_Networking cascade;
    Nota

    Instale a extensão no schema public para evitar problemas de permissão.

    CREATE extension Ganos_Networking WITH schema public cascade;
  • Crie uma tabela.

     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
     );
  • Insira registros.

     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);
  • Atualize as propriedades da tabela.

     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'   -- Both ways
                WHEN (cost>0 AND reverse_cost<0) THEN 'FT'  -- In the direction of the LINESTRING
                WHEN (cost<0 AND reverse_cost>0) THEN 'TF'  -- In the reverse direction of the LINESTRING
                ELSE '' END;
  • Crie uma topologia.

     SELECT pgr_createTopology('edge_table',0.001);
  • Consulte o caminho mais curto.

     -- Dijkstra shortest path
     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)
    
     -- A* path algorithm
     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)
    
     -- TRSP path algorithm
     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)
  • Remova a extensão (opcional).

     Drop Extension Ganos_Networking cascade;

Referência SQL

Para obter um manual SQL detalhado, consulte a documentação oficial do pgRouting.