Como Usar o PostGIS no ServBay: Adicionando Capacidades Geoespaciais ao PostgreSQL
O PostGIS
é uma poderosa extensão para o banco de dados PostgreSQL que adiciona suporte a tipos de dados, funções e índices geoespaciais. Isso significa que você pode armazenar informações geográficas — como pontos, linhas e polígonos — diretamente no banco de dados e executar consultas e análises espaciais complexas. Para desenvolvedores web que lidam com mapas, serviços de localização ou qualquer aplicação relacionada à geolocalização, o PostGIS é uma ferramenta indispensável.
O ServBay, um ambiente local de desenvolvimento web para macOS, já vem com o pacote PostgreSQL integrado e, por padrão, inclui a extensão PostGIS. Isso simplifica muito o uso do PostGIS localmente, eliminando a necessidade de compilar ou instalar dependências manualmente.
Neste artigo, você aprenderá em detalhes como ativar e começar a utilizar o PostGIS no ambiente ServBay, facilitando a adição de capacidades geoespaciais aos seus projetos.
Pré-requisitos
Antes de utilizar o PostGIS, certifique-se de que já cumpriu os seguintes passos:
- Instale e execute o ServBay: Verifique se o ServBay está instalado e em funcionamento no seu macOS.
- Habilite e inicie o pacote PostgreSQL: No painel de controle do ServBay, confirme que o pacote PostgreSQL está habilitado e em execução. Se ainda não estiver, localize-o no painel de controle, marque como ativo e inicie o serviço.
- Acesse o banco de dados PostgreSQL: Saiba como conectar ao PostgreSQL do ServBay usando a ferramenta de linha de comando
psql
ou clientes gráficos (como TablePlus, pgAdmin). Por padrão, você pode se conectar usandopsql -U postgres
.
Instalando e Habilitando a Extensão PostGIS
O ServBay já inclui os arquivos da extensão PostGIS; não é necessário download adicional. Apenas é preciso “habilitar” a extensão no banco de dados em que deseja utilizá-la.
Veja como ativar a extensão PostGIS:
Conecte-se ao banco de dados desejado: Abra o Terminal e utilize o comando
psql
para se conectar ao seu banco de dados. Substituayour_username
pelo seu usuário (ex:postgres
) eyour_database
pelo nome do banco de dados onde quer ativar o PostGIS.bashpsql -U your_username -d your_database
1Se deseja habilitar no usuário e banco padrão
postgres
, basta executar:bashpsql -U postgres
1Crie a extensão PostGIS no banco: Com a conexão já estabelecida no
psql
, digite o seguinte comando SQL:sqlCREATE EXTENSION postgis;
1Esse comando vai instalar e configurar todos os objetos necessários do PostGIS no banco conectado (tipos de dados, funções, operadores, etc.).
Verifique se a extensão foi instalada com sucesso: No prompt do
psql
, use o comando\dx
para listar as extensões instaladas no banco.sql\dx
1Se ativou corretamente, verá a entrada
postgis
e sua versão na lista.List of installed extensions Name | Version | Schema | Description -----------+---------+------------+-------------------------------------------------------------- plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language postgis | 3.3.2 | public | PostGIS geometry and geography spatial types and functions (2 rows)
1
2
3
4
5
6(Atenção: A versão do PostGIS pode variar conforme a versão do ServBay)
Pronto! Agora o PostGIS está ativo nesse banco de dados PostgreSQL e você já pode usar suas funcionalidades espaciais.
Configurando Dados PostGIS
Após habilitar o PostGIS, você pode criar novas tabelas com colunas geoespaciais ou adicionar colunas espaciais a tabelas existentes. O PostGIS oferece dois tipos de dados espaciais principais: geometry
e geography
. geometry
serve para cálculos em sistemas de coordenadas planos; geography
para cálculos em superfícies esféricas (como a Terra), ideal para armazenamento e consultas com latitude e longitude.
Criando tabelas com colunas geoespaciais
Veja como criar uma tabela chamada locations
com uma coluna para armazenar pontos geográficos.
Criando a tabela: No
psql
ou em um cliente gráfico conectado ao banco, execute:sqlCREATE TABLE locations ( id SERIAL PRIMARY KEY, name VARCHAR(100), geom GEOMETRY(Point, 4326) );
1
2
3
4
5GEOMETRY(Point, 4326)
: Define a colunageom
como tipoGEOMETRY
.Point
indica que ela armazena pontos.4326
é o SRID (Identificador de Referência Espacial), correspondente ao padrão WGS84 usado por GPS e mapas online como OpenStreetMap, Google Maps.- Você pode usar outros tipos de geometria (como
LineString
,Polygon
,MultiPoint
, etc.) e diferentes SRIDs conforme necessidade.
Inserindo dados de exemplo: Utilize funções PostGIS para inserir objetos geométricos na tabela. A função
ST_GeomFromText()
converte uma string WKT (Well-Known Text) em geometria.sqlINSERT INTO locations (name, geom) VALUES ('Sede da ServBay', ST_GeomFromText('POINT(116.4074 39.9042)', 4326)), -- Exemplo coordenadas de Pequim ('Escritório ServBay Xangai', ST_GeomFromText('POINT(121.4737 31.2304)', 4326)); -- Exemplo coordenadas de Xangai
1
2
3Note que no padrão WKT,
POINT(longitude latitude)
— ou seja, longitude vem antes da latitude.
Criando um índice espacial
Se você possui tabelas com grandes volumes de dados espaciais, é fundamental criar índices espaciais para acelerar consultas — principalmente buscas por região, inclusão ou vizinhança. O índice espacial mais comum no PostGIS é o GiST (Generalized Search Tree).
Criando o índice GiST: Com o banco conectado, rode:
sqlCREATE INDEX idx_locations_geom ON locations USING GIST (geom);
1Assim, o índice GiST será criado na coluna
geom
da tabelalocations
, permitindo que o otimizador do PostgreSQL acelere buscas espaciais automaticamente.
Realizando Consultas Geoespaciais com PostGIS
O PostGIS oferece centenas de funções para operações espaciais. Veja alguns exemplos clássicos usados por desenvolvedores web:
Calculando a distância entre dois pontos
Calcule a distância em linha reta entre duas localizações.
SELECT ST_Distance(
ST_GeomFromText('POINT(116.4074 39.9042)', 4326), -- Ponto A
ST_GeomFromText('POINT(121.4737 31.2304)', 4326) -- Ponto B
);
2
3
4
ST_Distance()
: Calcula a distância entre dois objetos geométricos. Para tipogeometry
com SRID 4326, o resultado é aproximado em graus. Para retornar a distância em metros, use o tipogeography
ou a funçãoST_Distance(geography_a, geography_b, use_spheroid)
.
Consultando relações de inclusão
Verifique se um objeto (ex: ponto) está contido em outro (ex: polígono), como checar se um ponto está dentro de uma área.
SELECT name FROM locations
WHERE ST_Contains(
ST_GeomFromText('POLYGON((116.0 39.0, 117.0 39.0, 117.0 40.0, 116.0 40.0, 116.0 39.0))', 4326), -- Exemplo de área retangular
geom
);
2
3
4
5
ST_Contains(geometry A, geometry B)
: Retorna true se o objeto A contém completamente o objeto B.
Localizar vizinhança (pontos mais próximos)
Encontre os locais mais próximos de um ponto de referência, usando o índice GiST para eficiência.
SELECT name, ST_Distance(geom, ST_GeomFromText('POINT(116.4074 39.9042)', 4326)) AS distance
FROM locations
ORDER BY geom <-> ST_GeomFromText('POINT(116.4074 39.9042)', 4326) -- O operador <-> utiliza o índice GiST para ordenar por distância
LIMIT 5;
2
3
4
- O operador
<->
permite buscas eficientes dos objetos mais próximos a uma geometria de referência.
Fazendo Análises Geoespaciais com PostGIS
Além das consultas básicas, o PostGIS oferece funções avançadas como criação de buffers, interseção, união de geometrias, entre outras.
Análise de Buffer
Crie uma área (polígono) em volta de uma geometria a uma distância especificada.
SELECT ST_Buffer(geom, 0.01) -- Cria buffer de 0,01 grau; cerca de 1,1km
FROM locations
WHERE name = 'Sede da ServBay';
2
3
ST_Buffer(geometry, distance)
: Cria um buffer ao redor de uma geometria. Em SRID 4326, o resultado está em graus.
Análise de Interseção
Calcule a área de sobreposição entre objetos geométricos distintos, retornando a nova geometria de cruzamento.
SELECT ST_Intersection(
ST_GeomFromText('POLYGON((116.0 39.0, 117.0 39.0, 117.0 40.0, 116.0 40.0, 116.0 39.0))', 4326),
geom
)
FROM locations
WHERE name = 'Sede da ServBay';
2
3
4
5
6
ST_Intersection(geometry A, geometry B)
: Retorna a sobreposição entre ambas como uma nova geometria.
Análise de União
Agrupe várias geometrias em um único objeto composto.
SELECT ST_Union(geom)
FROM locations;
2
ST_Union(geometry set)
: Funde todo o conjunto de entradas geométricas.
Visualizando Dados Geoespaciais
Visualizar os dados PostGIS é uma necessidade comum em desenvolvimento web. Isso pode ser feito usando softwares GIS desktop ou bibliotecas de mapas para web.
Usando ferramentas GIS desktop (exemplo: QGIS)
QGIS é um popular software GIS de código aberto que se conecta diretamente ao banco PostGIS e exibe os dados geoespaciais.
Conectando ao PostgreSQL do ServBay:
- Abra o QGIS.
- No menu, selecione
Layer
(Camada) ->Add Layer
(Adicionar Camada) ->Add PostGIS Layers...
(Adicionar Camadas PostGIS...). - Na janela pop-up, clique em
New
(Nova) para criar a conexão. - Preencha as informações:
- Nome: Dê um nome, ex:
ServBay PostGIS
. - Host:
localhost
ou127.0.0.1
. - Porta:
5432
(padrão do PostgreSQL/ServBay). - Database: Nome do banco de dados com PostGIS ativo.
- Username: Seu usuário (ex:
postgres
). - Password: Sua senha, se existir.
- Nome: Dê um nome, ex:
- Clique em
Test Connection
(Testar Conexão) para validar. - Clique em
OK
para salvar e depois emConnect
(Conectar).
Carregando dados espaciais:
- Com conexão ativa, verá a lista de tabelas do banco.
- Escolha a tabela com colunas geoespaciais (ex:
locations
). O QGIS as identifica automaticamente. - Selecione as tabelas desejadas, clique em
Add
(Adicionar) e depois emClose
(Fechar). Seus dados aparecerão no mapa do QGIS.
Usando bibliotecas web de mapas (exemplo: Leaflet)
Você pode exibir dados da PostGIS no front-end com bibliotecas JS como Leaflet, OpenLayers, Mapbox GL JS, consumindo via um serviço backend. Veja um exemplo simples de Leaflet para mostrar um mapa em HTML. O backend (ex: PHP, Node.js, Python — todos rodando no ServBay) deve ler do PostGIS e devolver dados no formato GeoJSON para o front.
Salve o HTML abaixo em um subdiretório do root do ServBay (padrão /Applications/ServBay/www
), como /Applications/ServBay/www/postgis-map/index.html
, e acesse pelo site local (ex: postgis-map.servbay.demo
).
<!DOCTYPE html>
<html>
<head>
<title>Exemplo ServBay PostGIS com Leaflet</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: 400px; width: 100%; } /* Definindo tamanho do mapa */
</style>
</head>
<body>
<h1>Exemplo de Visualização PostGIS (Leaflet)</h1>
<div id="map"></div>
<script>
// Inicializa o mapa com centro próximo a Pequim e nível de zoom
var map = L.map('map').setView([39.9042, 116.4074], 10);
// Adiciona camada do OpenStreetMap
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap contributors'
}).addTo(map);
// Exemplo: adiciona um marcador manualmente (em apps reais, carregue do PostGIS via backend)
// Este ponto corresponde ao dado de exemplo 'Sede da ServBay'
var marker = L.marker([39.9042, 116.4074]).addTo(map)
.bindPopup('<b>Sede da ServBay</b><br>Local de exemplo')
.openPopup();
// No projeto real, use Ajax/fetch para buscar dados do backend (GeoJSON)
// e adicione ao mapa com L.geoJSON(), assim:
/*
fetch('/api/locations') // Backend retorna GeoJSON em /api/locations
.then(response => response.json())
.then(data => {
L.geoJSON(data).addTo(map);
});
*/
</script>
</body>
</html>
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
O exemplo acima mostra apenas o uso básico do Leaflet. Para carregar dados reais, implemente no backend a conexão, consulta ao PostGIS, conversão para GeoJSON e o endpoint HTTP. O ServBay suporta várias linguagens backend, facilitando esse fluxo.
Perguntas Frequentes (FAQ)
P: Recebo erro ao executar
CREATE EXTENSION postgis;
. O que devo fazer?- R: Primeiro, confirme que está conectado corretamente ao PostgreSQL e que o usuário tem permissão para criar extensões (o usuário
postgres
normalmente tem). Depois, verifique se o pacote PostgreSQL está em execução no ServBay. Se persistir, consulte os logs do ServBay e do PostgreSQL para detalhes do erro.
- R: Primeiro, confirme que está conectado corretamente ao PostgreSQL e que o usuário tem permissão para criar extensões (o usuário
P: O que é SRID 4326? Posso usar outros SRIDs?
- R: O SRID (Spatial Reference Identifier) é um código numérico que identifica unicamente um sistema de referência espacial. O 4326 representa o sistema WGS84 de latitude/longitude (o padrão dos mapas web atualmente). Você pode sim usar outros SRIDs, como o Web Mercator (3857). A escolha depende da origem dos seus dados e do uso pretendido: para latitude/longitude e uso em mapas web, 4326 ou 3857 são ideais.
P: Qual a diferença entre os tipos
geometry
egeography
?- R: O tipo
geometry
trabalha com coordenadas em plano cartesiano (métrica euclidiana). O tipogeography
lida diretamente com a superfície esférica da Terra, permitindo cálculos precisos de distância e área em escalas globais. Para pequenas áreas ou quando a curvatura terrestre não é relevante, o uso degeometry
costuma ser mais simples e rápido. Para dados globais e cálculos precisos envolvendo latitude/longitude, usegeography
.
- R: O tipo
Conclusão
O PostGIS oferece poderosas capacidades de manipulação de dados geoespaciais para o PostgreSQL, sendo essencial no desenvolvimento de aplicações baseadas em localização. No ServBay, a ativação e uso do PostGIS no macOS é prática e descomplicada, sem instalações ou configurações extensas.
Neste artigo, mostramos como habilitar o PostGIS no ServBay, criar e gerenciar dados espaciais, executar consultas e análises comuns, além de sugestões para visualização dos dados. Com essas bases, você já pode explorar todo o potencial do PostGIS em seus projetos web geoespaciais usando ServBay. Para recursos avançados, consulte a documentação oficial do PostGIS e descubra muitas outras funções e possibilidades!