Fundamentos do PostGIS
PostGIS é uma extensão do Postgres que ensina ao banco de dados como armazenar, comparar e pesquisar formas no espaço, não apenas linhas de valores escalares.
Esta página constrói o modelo conceitual por trás disso: o que é realmente um sistema de referência de coordenadas, por que geometria e geografia existem como tipos separados e como o índice espacial torna "o que está por perto" uma pergunta rápida em vez de uma varredura completa da tabela.
Resumo
- PostGIS adiciona tipos e operadores espaciais ao Postgres para que "onde" se torne uma propriedade consultável e indexável de uma linha, assim como "quando" ou "quanto".
- Por que é Importante: Recursos cientes de localização como zonas de entrega, geofencing e busca de proximidade precisam de armazenamento e indexação cientes de geometria que uma coluna numérica simples não pode fornecer.
- Conceitos Chave: sistema de referência de coordenadas (CRS), SRID, geometry, geography, índice espacial, GiST.
- Quando Usar: Recorra a este modelo mental ao decidir como raciocinar sobre SRIDs, explicar por que os índices espaciais se comportam de maneira diferente dos índices B-tree, ou ao integrar alguém novo na modelagem de dados espaciais.
- Limitações / Compromissos: A correção espacial depende inteiramente do rastreamento consistente dos sistemas de referência de coordenadas, e errar nisso produz resultados que parecem plausíveis, mas estão silenciosamente incorretos.
- Tópicos Relacionados: tipos geometry vs geography, indexação espacial GiST, ajuste de desempenho PostGIS, arquitetura de servidor de tiles.
Fundamentos
Um par de números como (-73.99, 40.75) não é uma localização por si só; é uma localização apenas quando você sabe em qual sistema de coordenadas esses números foram medidos.
Esse sistema de coordenadas é chamado de sistema de referência de coordenadas, ou CRS, e ele define a origem, as unidades e a forma do modelo da Terra contra o qual os números são plotados.
O PostGIS identifica cada CRS com um SRID numérico, e o mais comum para GPS e mapas da web é o SRID 4326, que representa latitude e longitude brutas no modelo WGS84 da Terra.
Cada valor de geometria ou geografia no PostGIS carrega seu SRID junto com ele, então duas formas só podem ser comparadas de forma significativa depois que o banco de dados souber que elas compartilham, ou podem ser convertidas para, o mesmo sistema de referência.
O PostGIS representa dados espaciais com dois tipos conceitualmente diferentes, e a diferença não é cosmética.
geometry trata a Terra como um plano e faz seus cálculos com geometria planar comum, o que é rápido e preciso, desde que a área coberta seja pequena o suficiente para que a planicidade seja uma aproximação razoável.
geography trata a Terra como uma esfera ou esferoide e faz seus cálculos com geodésicas, o que permanece preciso em grandes distâncias ao custo de mais computação.
Uma analogia útil é um mapa de papel versus um globo: um mapa de papel (geometry) é simples e rápido de medir, mas distorce à medida que a área aumenta, enquanto um globo (geography) permanece preciso em todos os lugares, mas exige mais trabalho para computar.
A escolha entre eles é realmente uma escolha sobre quanta curvatura da Terra os dados precisam respeitar, não uma escolha sobre qual tipo é "melhor".
As mecânicas profundas dessa escolha, incluindo qual SRID escolher para qual caso de uso, pertencem à comparação geometry vs geography em outra parte desta seção, e esta página só precisa da divisão conceitual para construir.
Mecânicas e Interações
O PostGIS não existe como um banco de dados espacial separado acoplado ao Postgres; ele existe como tipos e operadores registrados dentro do próprio sistema de extensibilidade do Postgres.
Isso é importante porque significa que as colunas espaciais participam das mesmas transações, backups e replicação que todas as outras colunas na mesma tabela.
Pesquisar por "tudo a menos de 5 quilômetros" ingenuamente exigiria o cálculo de uma distância exata contra cada linha de uma tabela, o que não escala.
A indexação espacial existe para evitar isso, e funciona com uma ideia de duas fases: primeiro, estreitar os candidatos de forma barata, depois, confirmar precisamente.
A primeira fase barata substitui cada forma complexa por sua caixa delimitadora (bounding box), o menor retângulo que a contém completamente, pois comparar retângulos é muito mais barato do que comparar polígonos.
O método de acesso GiST (Generalized Search Tree) do Postgres é o que torna essa primeira fase um índice em vez de uma varredura, organizando as caixas delimitadoras em uma árvore onde formas próximas se agrupam nos mesmos ramos.
Um índice espacial GiST elimina rapidamente formas cujas caixas delimitadoras não podem satisfazer a consulta, deixando apenas um pequeno conjunto de candidatos.
A segunda fase, então, executa o teste geométrico exato, como ST_DWithin ou ST_Intersects, apenas contra esse pequeno conjunto de candidatos para obter uma resposta precisa.
Esse padrão de duas fases é o motivo pelo qual as consultas espaciais escalam: a matemática exata e cara só é executada contra um punhado de linhas em vez da tabela inteira.
-- Conceitualmente, um predicado espacial é respondido em duas fases:
-- 1. GiST estreita por sobreposição de caixa delimitadora (o operador &&)
-- 2. A função exata confirma a forma real
SELECT id FROM stores
WHERE geom && ST_Expand(:query_point, 5000) -- pré-filtro barato de caixa delimitadora
AND ST_DWithin(geom, :query_point, 5000); -- confirmação geométrica exataÉ também por isso que um índice espacial não se comporta como um B-tree: um B-tree assume que os valores são ordenados em uma única linha, enquanto o GiST assume que os valores se sobrepõem em espaço multidimensional e não tem uma única ordem de classificação para se apoiar.
Considerações Avançadas e Aplicações
O sistema de tipos do PostGIS se generaliza além de geometry e geography para extensões opcionais como postgis_topology para redes de bordas compartilhadas e postgis_raster para imagens baseadas em grade, e cada uma estende a mesma ideia central de dados espaciais tipados com operadores e índices correspondentes.
Erros no sistema de referência de coordenadas são uma das falhas de produção mais comuns em sistemas espaciais, pois uma consulta que mistura SRID 4326 com um SRID projetado pode silenciosamente retornar distâncias numericamente válidas, mas geograficamente sem sentido.
Em grande escala, armazenar cada forma com precisão total impõe um custo real de índice e I/O, e simplificar geometrias antes de indexá-las é uma maneira comum de manter o pré-filtro de caixa delimitadora barato sem alterar o modelo de dados subjacente.
Sistemas espaciais normalmente dividem responsabilidades entre o Postgres como o sistema transacional de registro e um servidor de tiles dedicado para renderização, pois o PostGIS otimiza para correção e junções, não para streaming de tiles de mapa pré-renderizados em alto volume de requisições.
A observabilidade para recursos espaciais deve incluir auditoria de SRID e verificações de ST_IsValid na geometria ingerida, pois formas inválidas ou incompatíveis tendem a falhar silenciosamente em vez de gerar erros óbvios.
A linha arquitetônica é a mesma que o pgvector demonstra em outros lugares nesta pilha: uma extensão conquista desempenho real estendendo o framework existente de tipos, operadores e índices do Postgres em vez de contorná-lo.
| Abordagem | Força | Fraqueza | Melhor Ajuste |
|---|---|---|---|
| Colunas numéricas brutas de lat/lon | Simples, nenhuma extensão necessária | Sem indexação espacial ou operadores geométricos | Armazenar um único ponto sem consultas de proximidade |
| PostGIS geometry/geography com GiST | Consultas espaciais rápidas, indexadas e exatas dentro de transações | Requer disciplina de SRID e manutenção de índice | Zonas de entrega, geofencing, junções espaciais |
| Motor GIS externo ou serviço de tiles | Otimizado para renderização e protocolos OGC padrão | Sistema separado, eventualmente consistente com o Postgres | Servir tiles de mapa de alto volume |
Concepções Errôneas Comuns
- "Um par de latitude e longitude é uma localização completa" - a realidade é que as coordenadas são sem sentido sem um sistema de referência de coordenadas conhecido, que é exatamente o que o SRID registra.
- "geometry e geography são intercambiáveis" - a realidade é que eles codificam modelos de Terra diferentes, e usar o incorreto para a distância incorreta produz resultados que parecem válidos, mas estão errados.
- "Índices espaciais funcionam como índices B-tree em coordenadas" - a realidade é que o GiST indexa sobreposição multidimensional, sem uma única ordem classificável, então ele se comporta de maneira fundamentalmente diferente.
- "Um índice sozinho garante resultados espaciais corretos" - a realidade é que o GiST apenas estreita os candidatos por caixa delimitadora, e a função geométrica exata ainda tem que confirmar a resposta real.
- "PostGIS substitui a necessidade de um servidor de tiles" - a realidade é que o PostGIS é otimizado para armazenamento, junções e correção, não para entrega de tiles renderizados de alto volume.
FAQs
O que o PostGIS realmente adiciona ao Postgres?
Ele adiciona tipos espaciais, operadores espaciais e indexação espacial para que "onde" se torne uma propriedade de primeira classe e consultável de uma linha.
Por que um par bruto de latitude e longitude não significa nada por si só?
Porque os mesmos números podem descrever locais reais diferentes dependendo de em qual sistema de referência de coordenadas foram medidos, razão pela qual cada valor PostGIS carrega um SRID.
O que é um SRID, em termos simples?
É um identificador numérico para um sistema de referência de coordenadas específico, dizendo ao Postgres exatamente como interpretar as coordenadas de uma forma.
Por que o PostGIS tem dois tipos espaciais em vez de um?
geometry modela a Terra como um plano para matemática local rápida, enquanto geography a modela como uma esfera para matemática de longa distância precisa, e cada um se adapta a uma escala diferente de problemas.
Como um índice espacial realmente torna as consultas de proximidade rápidas?
- Primeiro, ele substitui cada forma por sua caixa delimitadora, que é barata de comparar.
- Em seguida, ele executa o teste geométrico exato apenas no pequeno conjunto de candidatos que sobrevivem a esse filtro barato.
Por que o GiST é usado em vez de um B-tree para dados espaciais?
O B-tree assume que os valores são ordenados em uma única linha, mas as formas espaciais se sobrepõem em múltiplas dimensões sem uma única ordem natural, que é exatamente a estrutura que o GiST é construído para indexar.
Um índice espacial garante uma resposta exata por si só?
Não, o índice apenas estreita os candidatos por caixa delimitadora, e a consulta ainda precisa de uma função exata como ST_DWithin para confirmar a resposta geométrica real.
O que acontece se duas geometrias com SRIDs diferentes forem comparadas diretamente?
A comparação é rejeitada ou silenciosamente sem sentido, razão pela qual a transformação para um sistema de referência compartilhado antes da comparação é importante.
Quando uma equipe deve optar por geography em vez de geometry?
Quando as distâncias precisam permanecer precisas em uma área ampla, como consultas de raio GPS globais, a matemática esférica do geography evita a distorção que a geometria planar introduz nessa escala.
Por que o PostGIS geralmente não é o sistema que renderiza tiles de mapa?
O PostGIS é otimizado para armazenamento transacional, junções espaciais e correção, enquanto a renderização de tiles favorece um pipeline dedicado e amigável ao cache, construído para essa única tarefa.
Qual é o bug espacial mais comum no mundo real?
Misturar sistemas de referência de coordenadas, como calcular a distância em geometria 4326 não projetada e ler o resultado como metros quando na verdade são graus.
Adicionar mais precisão espacial sempre ajuda no desempenho da consulta?
Não, formas de maior precisão ou mais complexas tornam o pré-filtro de caixa delimitadora menos seletivo e aumentam o custo de índice e armazenamento, portanto, a simplificação geralmente vale a pena em escala.
Relacionados
- Noções Básicas de PostGIS - instalando a extensão e escolhendo entre Postgres e um servidor de tiles.
- Geometry vs Geography - a comparação completa de tipos e SRIDs que esta página apenas resume.
- Índices Espaciais - padrões concretos de criação de índices GiST e consulta.
- Desempenho do PostGIS - técnicas de simplificação e pré-filtro de caixa delimitadora em escala.
- Noções Básicas de Extensões - como funciona o sistema de extensões ao qual o PostGIS se conecta.
Versões da Pilha: Esta página foi escrita para PostGIS 3.5+. Caso contrário, é conceitual e não vinculada a uma versão secundária específica do PostgreSQL.