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:
Vrepresenta o conjunto de vértices do grafo. Os elementos emVsã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: |
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.
|
[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.
|
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". 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;NotaInstale 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.