Análise de Roteamento Geoespacial com pgRouting no ServBay
pgRouting
é um poderoso módulo de extensão para bancos de dados PostgreSQL e PostGIS, projetado para fornecer funcionalidades avançadas de roteamento e análise de redes em dados espaciais. Com o pgRouting
, desenvolvedores podem executar consultas complexas sobre dados de rede viária, como encontrar o caminho mais curto entre dois pontos, resolver o Problema do Caixeiro-Viajante (TSP) ou realizar análise de áreas de serviço. Essas funções são essenciais em cenários de aplicativos de mapas, planejamento logístico, análise de tráfego e outros.
Neste guia, você aprenderá, passo a passo, como habilitar a extensão pgRouting
em seu banco de dados PostgreSQL dentro do ambiente local ServBay, além de como configurá-la e realizar análises de roteamento básicas.
Visão Geral
O ServBay oferece aos desenvolvedores no macOS um ambiente local de desenvolvimento web conveniente e integrado, com diversos servidores web, bancos de dados e linguagens de programação já inclusos. O pacote de PostgreSQL fornecido pelo ServBay já vem com as extensões pgRouting
e PostGIS
instaladas. Isso elimina a necessidade de baixar ou compilar essas extensões manualmente — basta habilitá-las no banco de dados desejado.
Pré-requisitos
Antes de utilizar o pgRouting
, certifique-se de que as seguintes condições estejam atendidas:
- ServBay instalado e em execução: Caso ainda não tenha o ServBay, acesse o site oficial do ServBay para baixar e instalar a versão mais recente.
- Pacote de PostgreSQL instalado e ativo no ServBay: No painel do ServBay, verifique se o pacote PostgreSQL está instalado e em estado “Executando”.
- Conhecimentos básicos de SQL e PostgreSQL: Este tutorial assume familiaridade básica com o banco de dados PostgreSQL e com consultas SQL.
- Familiaridade com PostGIS: O
pgRouting
depende doPostGIS
para lidar com tipos de dados e funções espaciais. Certifique-se de que sua base de dados tenha a extensão PostGIS ativada. O pacote PostgreSQL do ServBay geralmente já inclui o PostGIS.
Instalando e Habilitando a Extensão pgRouting
O ServBay já prepara todos os arquivos necessários do pgRouting
para você — basta habilitar a extensão no banco de dados em que deseja utilizar.
Conectando ao Banco de Dados PostgreSQL:
Existem diversas formas de se conectar ao PostgreSQL, como pela linha de comando com o
psql
, ferramentas gráficas (pgAdmin, DBeaver) ou bibliotecas cliente em linguagens de programação.O uso do
psql
fornecido pelo ServBay é uma das maneiras mais práticas. Você pode lançar um terminal pré-configurado para o ServBay clicando no botão “Terminal” no app, ou adicionar manualmente o diretório bin do ServBay à variável de ambiente PATH do sistema.No terminal, conecte-se ao banco de dados desejado (por exemplo, um banco chamado
servbay_geo_db
, com o usuário padrãoservbay
):bashpsql -U servbay -d servbay_geo_db
1Se o nome do banco, usuário ou senha forem diferentes, ajuste o comando conforme necessário.
Verificando e habilitando a extensão PostGIS (caso necessário):
O
pgRouting
exige o PostGIS. Antes de habilitar opgRouting
, ative o PostGIS executando, no prompt dopsql
:sqlCREATE EXTENSION IF NOT EXISTS postgis;
1Este comando cria (ou ignora, se já existir) a extensão PostGIS.
Criando a extensão pgRouting:
Com a mesma conexão de banco de dados, execute:
sqlCREATE EXTENSION pgrouting;
1Você verá a mensagem
CREATE EXTENSION
caso tudo ocorra sem erros.Verificando a instalação:
Para garantir que o
pgRouting
está ativo, liste as extensões instaladas:sql\dx
1Na lista, você deverá encontrar
postgis
epgrouting
com suas respectivas informações.
Configuração do pgRouting: Preparando Dados de Rede Viária e Criando a Topologia
Os algoritmos do pgRouting
trabalham sobre tabelas que representem redes viárias. Normalmente, isso requer uma tabela de segmentos (vias), cada um com ID de origem, de destino e pesos (como distância ou tempo). Para que os cálculos de roteamento funcionem bem, também é preciso gerar uma “topologia”, identificando as conexões (nós) entre os segmentos.
Criando a Tabela de Dados de Rede Viária
Veja um exemplo básico de criação da tabela ways
, que armazena segmentos viários. Ela inclui o ID do segmento, os IDs de nó fonte e destino, custo e custo inverso, além da geometria em formato GEOMETRY
do PostGIS.
sql
-- Cria uma tabela para armazenar dados da rede viária
CREATE TABLE ways (
id SERIAL PRIMARY KEY, -- Identificador único do segmento
source INTEGER, -- ID do nó inicial
target INTEGER, -- ID do nó final
cost DOUBLE PRECISION, -- Custo para atravessar este segmento (ex: distância, tempo)
reverse_cost DOUBLE PRECISION, -- Custo para atravessar no sentido inverso
geom GEOMETRY(LineString, 4326) -- Geometria do segmento como LineString, SRID 4326 (WGS 84)
);
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
Explicação:
SERIAL PRIMARY KEY
: Cria automaticamente um ID único por segmento.source
,target
: Referenciam os nós de início e término do segmento — você pode gerar ou associar estes IDs ao criar a topologia.cost
,reverse_cost
: Definem o peso da ligação (por exemplo, definareverse_cost
como NULL ou um valor muito alto para mão única).geom
: Utiliza o tipo GEOMETRY do PostGIS, com LineString e SRID 4326 (WGS 84).
Inserindo Dados de Exemplo
Inclua alguns segmentos de teste na tabela ways
:
sql
-- Insere segmentos de exemplo
INSERT INTO ways (source, target, cost, reverse_cost, geom) VALUES
(1, 2, 1.0, 1.0, ST_SetSRID(ST_MakeLine(ST_MakePoint(116.4074, 39.9042), ST_MakePoint(116.4084, 39.9052)), 4326)),
(2, 3, 1.0, 1.0, ST_SetSRID(ST_MakeLine(ST_MakePoint(116.4084, 39.9052), ST_MakePoint(116.4094, 39.9062)), 4326)),
(3, 4, 1.0, 1.0, ST_SetSRID(ST_MakeLine(ST_MakePoint(116.4094, 39.9062), ST_MakePoint(116.4104, 39.9072)), 4326));
1
2
3
4
5
2
3
4
5
Explicação:
ST_MakePoint(x, y)
: Cria um ponto (longitude, latitude) no PostGIS.ST_MakeLine(point1, point2)
: Cria uma linha entre dois pontos.ST_SetSRID(geometry, srid)
: Define o sistema de referência espacial.- Os dados simulam três segmentos conectados, todos com custo 1.0. As coordenadas são exemplos na região central de Pequim.
Criando a Topologia
Com a tabela de rede pronta, gere a topologia usando pgr_createTopology
. Esse procedimento identifica os nós e preenche as colunas source
e target
, além de gerar uma tabela extra de nós (normalmente [nome_da_tabela]_vertices_pgr
).
sql
-- Cria a topologia da rede viária
-- Parâmetros:
-- 'ways': nome da tabela
-- 0.00001: tolerância (distância máxima para considerar dois pontos como o mesmo nó)
-- 'geom': coluna de geometria
-- 'id': coluna ID
SELECT pgr_createTopology('ways', 0.00001, 'geom', 'id');
1
2
3
4
5
6
7
2
3
4
5
6
7
Explicação:
pgr_createTopology
: Função do pgRouting que constrói o modelo nó-aresta.- O valor da tolerância define a distância máxima para distinguir nós coincidentes. Ajuste conforme a precisão e escala do seu dado.
Após executar, as colunas source
e target
de ways
são preenchidas, e a tabela ways_vertices_pgr
será criada com os nós e suas coordenadas.
Executando Análises com pgRouting
Com a topologia criada, você já pode executar os algoritmos do pgRouting
para análise de rotas. Veja exemplos de uso dos algoritmos mais comuns.
Análise de Caminho Mais Curto (Dijkstra)
O cálculo do caminho mais curto entre dois nós é um dos usos mais frequentes. O pgRouting implementa o algoritmo de Dijkstra:
sql
-- Busca o caminho mais curto do nó 1 ao nó 4
-- Parâmetros:
-- 'SELECT id, source, target, cost FROM ways': consulta base dos segmentos
-- 1: nó inicial
-- 4: nó final
-- directed := true: considera direcionalidade (cost e reverse_cost diferentes)
SELECT seq, id1 AS node, id2 AS edge, cost, geom
FROM pgr_dijkstra(
'SELECT id, source, target, cost FROM ways',
1, -- Nó inicial
4, -- Nó final
directed := true -- Defina como false ou omita para não-direcional
)
JOIN ways ON edge = ways.id; -- Junta com a tabela ways para obter geometria
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
Explicação:
pgr_dijkstra
: Algoritmo de caminho mais curto.- O primeiro parâmetro deve retornar pelo menos: id, source, target, cost (adicione reverse_cost se quiser permitir caminho reverso e use directed := false).
- Os parâmetros a seguir são os IDs dos nós inicial e final.
- O JOIN serve para obter as geometrias originais para possível visualização.
Problema do Caixeiro-Viajante (Traveling Salesperson Problem – TSP)
O TSP encontra o menor ciclo (ou rota de menor custo) que visita todos os nós especificados.
sql
-- Resolve o TSP para os nós 1, 2, 3, 4, começando do nó 1
-- Parâmetros:
-- 'SELECT id, x::float8 AS x, y::float8 AS y FROM ways_vertices_pgr': consulta com os nós e coordenadas
-- start_id := 1: nó inicial
SELECT seq, node, edge, cost
FROM pgr_tsp(
'SELECT id, ST_X(the_geom)::float8 AS x, ST_Y(the_geom)::float8 AS y FROM ways_vertices_pgr WHERE id IN (1, 2, 3, 4)',
start_id := 1
);
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
Explicação:
pgr_tsp
: Solução do TSP.- O parâmetro é uma consulta que retorna os IDs, X e Y dos nós a serem visitados (geralmente da tabela ways_vertices_pgr).
- O parâmetro
start_id
especifica o nó de início.
Análise de Área de Serviço (Driving Distance / Driving Time)
A análise de área de serviço define quais trechos ou regiões são alcançáveis a partir de um nó dentro de um custo máximo.
sql
-- Do nó 1, busca todos os segmentos acessíveis com custo máximo 2
-- Parâmetros:
-- 'SELECT id, source, target, cost FROM ways': consulta base
-- 1: nó inicial
-- 2: custo máximo permitido
-- directed := true: considera direção
SELECT seq, id1 AS node, id2 AS edge, cost, geom
FROM pgr_drivingDistance(
'SELECT id, source, target, cost FROM ways',
1, -- Nó inicial
2, -- Custo máximo
directed := true
)
JOIN ways ON edge = ways.id; -- Junta com tabela ways para obter geometria
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
Explicação:
pgr_drivingDistance
: Algoritmo de análise de área de serviço.- Parâmetros análogos ao de Dijkstra, apenas com o custo máximo adicionado.
Visualizando os Resultados do pgRouting
Visualizar os resultados do pgRouting é essencial para interpretação e apresentação. Você pode usar ferramentas GIS desktop ou bibliotecas web para mapas.
Com Ferramentas Desktop GIS (ex: QGIS)
O QGIS é um aplicativo GIS gratuito e open source que conecta diretamente ao PostgreSQL/PostGIS, permitindo visualizar tabelas e consultas do pgRouting.
- Abra o QGIS.
- Vá em Layer (Camada) > Data Source Manager (Gerenciador de Fontes de Dados).
- No menu à esquerda, clique em PostGIS.
- Clique no botão Novo (New) para criar uma nova conexão.
- Preencha os dados de conexão PostgreSQL do ServBay (ex: Host:
localhost
, Port:5432
, Base:servbay_geo_db
, Usuário:servbay
, Senha: sua senha PostgreSQL). Você pode testar a conexão. - Ao conectar, explore as tabelas disponíveis, como
ways
eways_vertices_pgr
. - Escolha a tabela ou view desejada (por exemplo, uma view de resultado de rota) e clique em Add (Adicionar) para visualizar no QGIS.
Visualizando em Aplicativos Web (Leaflet ou OpenLayers)
Para web apps, seu backend (PHP, Node.js, Python, etc.) precisa executar as queries pgRouting e retornar os resultados em GeoJSON ou outro formato suportado pelo front-end. O front-end (Leaflet/OpenLayers) então exibe essas rotas interativamente.
Veja um exemplo HTML básico para exibir uma linha estática no Leaflet. Para resultados dinâmicos de rota, siga estes passos:
- Execute as queries pgRouting no backend.
- Converta as geometrias de segmento para GeoJSON.
- Forneça o GeoJSON via endpoint API.
- No JavaScript do front-end, carregue e exiba o GeoJSON.
html
<!DOCTYPE html>
<html>
<head>
<title>Exemplo de Visualização Web pgRouting no ServBay</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
<style>
#map { height: 600px; width: 100%; } /* Define tamanho do mapa */
</style>
</head>
<body>
<h1>Visualização de Resultados pgRouting no ServBay</h1>
<div id="map"></div>
<script>
// Inicializa o mapa, define centro e zoom
var map = L.map('map').setView([39.906, 116.409], 14); // Região do exemplo
// Adiciona camada base do OpenStreetMap
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);
// Exemplo: adiciona GeoJSON convertido de consulta pgRouting
// Na prática, geojsonData seria carregado do backend via AJAX
var geojsonData = {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {
"id": 1,
"cost": 1.0
},
"geometry": {
"type": "LineString",
"coordinates": [
[116.4074, 39.9042],
[116.4084, 39.9052]
]
}
},
{
"type": "Feature",
"properties": {
"id": 2,
"cost": 1.0
},
"geometry": {
"type": "LineString",
"coordinates": [
[116.4084, 39.9052],
[116.4094, 39.9062]
]
}
},
{
"type": "Feature",
"properties": {
"id": 3,
"cost": 1.0
},
"geometry": {
"type": "LineString",
"coordinates": [
[116.4094, 39.9062],
[116.4104, 39.9072]
]
}
}
]
};
// Adiciona GeoJSON no mapa
L.geoJSON(geojsonData, {
style: function (feature) {
return {color: "#ff0000", weight: 4};
}
}).addTo(map);
// Ajusta a visão do mapa para cobrir todos os elementos
if (L.geoJSON(geojsonData).getBounds().isValid()) {
map.fitBounds(L.geoJSON(geojsonData).getBounds());
}
</script>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
Salve este arquivo HTML no diretório raiz do seu site no ServBay (ex: /Applications/ServBay/www/pgrouting-demo/index.html
) e acesse via navegador (ex: http://pgrouting-demo.servbay.demo
) para ver o mapa com a rota de exemplo. Lembre-se: este é apenas um exemplo estático para demonstrar o carregamento de GeoJSON no Leaflet.
Dicas e Observações
- Qualidade dos dados: Os resultados do
pgRouting
dependem fortemente da qualidade dos dados da rede viária. Certifique-se de que os dados estejam com topologia correta, completos e precisos. - Performance: Para grandes redes viárias, o cálculo pode exigir bastante processamento. Use índices, simplifique redes ou considere algoritmos mais eficientes quando necessário.
- Memória: Grandes topologias podem consumir muitos recursos. Tenha certeza de que o servidor tem RAM suficiente, especialmente para grandes bancos de dados.
Perguntas Frequentes (FAQ)
P: Ao executar CREATE EXTENSION pgrouting;
recebo erro dizendo que a extensão não existe. O que fazer?
R: Primeiro, confirme que o pacote PostgreSQL está instalado e ativo no ServBay. Em seguida, verifique se o banco em questão e a versão do PostgreSQL suportam o pgRouting
(os pacotes normalmente já incluem a extensão). Se o problema persistir, confira os logs do ServBay ou do PostgreSQL para detalhes. Certifique-se também de estar logado com um usuário que possua permissões suficientes (por exemplo, o usuário servbay
).
P: Como escolher o valor da tolerância (tolerance
) na função pgr_createTopology
?
R: A tolerância depende da precisão dos seus dados espaciais. Ela determina qual distância mínima entre vértices é usada para agrupá-los como um nó único. Dados de alta precisão (ex: coordenadas GPS) suportam tolerâncias muito baixas (ex: 0.000001 ou menos). Se os dados tiverem menor precisão ou várias fontes, use valores maiores para assegurar conectividade. Cuidado: tolerâncias excessivas podem unir erroneamente segmentos distintos.
P: Como lidar com ruas de mão única ou proibir retornos?
R: As colunas cost
e reverse_cost
foram feitas para isso. Para ruas de mão única, defina o reverse_cost
como NULL ou um valor muito alto para impedir o fluxo inverso. Para bloqueios de retorno, modelos de rede viária mais avançados ou tratamentos posteriores na rota podem ser necessários. O pgRouting
oferece funções avançadas para lidar com casos como esses.
Conclusão
Com o ServBay, configurar um banco de dados PostgreSQL local com suporte ao pgRouting
ficou simples e rápido. Basta executar alguns comandos SQL para habilitar a extensão, preparar os dados de sua rede e criar a topologia, aproveitando assim todo o potencial dos algoritmos de análise de roteamento geoespacial do pgRouting
. Aliando isso a ferramentas GIS desktop ou bibliotecas web de mapas, você pode visualizar facilmente rotas e análises, fornecendo recursos avançados para seus projetos web ou sistemas geoespaciais. O ServBay elimina a complexidade da configuração do ambiente, permitindo que os desenvolvedores se concentrem na lógica e funcionalidades aplicacionais.