Geometry vs Geography
O geometry do PostGIS usa matemática planar em um sistema de coordenadas projetado. O geography usa um modelo de esferoide no WGS84 para distâncias geodésicas em metros. Escolha o tipo que corresponde às suas necessidades de SRID e precisão de distância.
Receita
-- Mesma longitude/latitude, tipos diferentes
SELECT
extensions.ST_SetSRID(extensions.ST_MakePoint(-73.9857, 40.7484), 4326) AS geom_4326,
extensions.ST_SetSRID(extensions.ST_MakePoint(-73.9857, 40.7484), 4326)::extensions.geography AS geog;
-- Distância NYC para LA
SELECT extensions.ST_Distance(
extensions.ST_SetSRID(extensions.ST_MakePoint(-73.9857, 40.7484), 4326)::extensions.geography,
extensions.ST_SetSRID(extensions.ST_MakePoint(-118.2437, 34.0522), 4326)::extensions.geography
) AS meters_geog;
SELECT extensions.ST_Distance(
extensions.ST_SetSRID(extensions.ST_MakePoint(-73.9857, 40.7484), 4326),
extensions.ST_SetSRID(extensions.ST_MakePoint(-118.2437, 34.0522), 4326)
) AS degrees_geom_wrong_for_meters;Quando usar isto: Ao escolher tipos de coluna para novas tabelas, depurar bugs de distância ou otimizar índices para ST_DWithin.
Exemplo de Trabalho
CREATE TABLE delivery_zones (
id serial PRIMARY KEY,
name text,
-- Polígono em escala de cidade: UTM local para matemática de geometria precisa
zone_geom extensions.geometry(Polygon, 32618), -- UTM 18N para a área de NYC
-- Consultas de localização de motorista: geografia para raio em metros a partir do GPS
service_geog extensions.geography(Polygon, 4326)
);
-- Armazene ambos quando necessário: geometria para edição na projeção local,
-- geografia para consultas "dentro de 2 km do motorista"
CREATE INDEX delivery_zones_geog_gist
ON delivery_zones USING gist (service_geog);
SELECT name
FROM delivery_zones
WHERE extensions.ST_DWithin(
service_geog,
extensions.ST_SetSRID(extensions.ST_MakePoint(-73.99, 40.75), 4326)::extensions.geography,
2000
);O que isto demonstra:
geometryprojetada localmente para polígonos de planejamento urbanogeographypara filtros de raio GPS em metros- GiST em geografia suporta
ST_DWithin - Modelos mistos são válidos quando as transformações são documentadas
Mergulho Profundo
Tabela de Comparação
| Aspecto | geometry | geography |
|---|---|---|
| Sistema de coordenadas | Projetado (metros no plano) | Esferoide WGS84 |
| Unidades de distância | Unidades do mapa (metros se projetado) | Metros no esferoide |
| Desempenho | Mais rápido para áreas locais | Mais lento, mais preciso globalmente |
| Funções | Conjunto planar completo | Subconjunto; casts frequentemente necessários |
| SRID | Deve ser projetado para matemática em metros | Tipicamente 4326 |
Referência Rápida de SRID
| SRID | Nome | Uso |
|---|---|---|
| 4326 | WGS84 lat/lon | GPS, mapas web, geografia |
| 3857 | Web Mercator | Apenas para exibição; ruim para distância |
| 32618 | UTM 18N | Trabalho planar na região de NYC |
| 0 | Desconhecido | Evitar em produção |
SELECT srid, auth_name, auth_srid, srtext
FROM spatial_ref_sys
WHERE srid IN (4326, 3857, 32618);Transformações
-- Reprojetar geometria entre SRIDs
SELECT extensions.ST_Transform(
extensions.ST_SetSRID(extensions.ST_MakePoint(-73.9857, 40.7484), 4326),
32618
);
-- Geografia a partir de geometria (apenas 4326 para cast de geog)
SELECT extensions.ST_SetSRID(extensions.ST_MakePoint(-73.9857, 40.7484), 4326)::extensions.geography;Considerações sobre Índices
- GiST funciona tanto em geometria quanto em geografia.
- Use geometria com projeção local correta para sobreposições de polígonos grandes (mais rápido).
- Use geografia para raios de metros consistentes em entradas lat/lon sem matemática de projeção no aplicativo.
Armadilhas
- Distância de geometria 4326 em metros -
ST_Distanceem geometria 4326 retorna graus. Correção: Converta para geografia ou transforme para UTM. - 3857 para análise - Web Mercator distorce área e distância. Correção: 3857 apenas para tiles; armazene 4326 ou UTM local.
- Inserção SRID 0 -
ST_GeomFromText('POINT(0 0)')sem SRID. Correção: O Typmodgeometry(Point,4326)rejeita SRID incorreto quando aplicado. - geography em não-4326 - Suporte limitado; resultados incorretos. Correção: Transforme para 4326 antes do cast para geography.
- Mistura de tipos em ST_Intersects - Surpresas de cast implícito. Correção: Cast explícito e documente o pipeline.
- Polos e linha internacional de data - geografia lida com isso; polígonos ruins em geometria ingênua. Correção: Valide com
ST_IsValid.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| geometry + UTM | Região fixa de cidade/condado | Consultas de roaming global |
| apenas geography | Aplicativos simples de raio GPS | Dor de desempenho em sobreposição pesada de polígonos |
| Haversine no aplicativo | Distância única | Junções espaciais e índices necessários |
| Tiles raster | Mapas apenas para exibição | Armazenamento de feições vetoriais |
FAQs
Qual tipo para raio de entrega?
geography em 4326 para ST_DWithin em metros a partir de pontos GPS.Armazenamento de polígonos?
Cidade local: geometria projetada. Áreas de serviço globais: geografia ou divisões UTM de múltiplas zonas.Unidades de ST_Length?
geometry: unidades do mapa; geography: metros no esferoide.Cálculos de área?
Use projeção apropriada; a área de geografia é baseada no esferoide.Aplicação de Typmod?
geometry(Point,4326) rejeita inserções de SRID incorretas no PostGIS recente.Dica de desempenho?
O operador de caixa delimitadora && em casts de geometria para geografia usa pré-filtragem de índice.EWKT?
SRID=4326;POINT(...) em COPY para ingestão explícita de SRID.geography 3D?
Raro; geralmente descarta Z para aplicativos web.Exportação QGIS?
Corresponda o SRID nas configurações de exportação ao typmod da coluna.Testes?
Pares de distância conhecidos (NYC-LA ~3935 km) para verificação de consultas.Relacionados
- Noções Básicas de PostGIS - quando PostGIS vs tiles
- Índices Espaciais - uso de GiST
- Desempenho do PostGIS - pré-filtro de limites
- Tipos de Dados JSONB - padrões compostos
- Melhores Práticas do PostGIS - SRID em toda geometria
Versões da Stack: Esta página foi escrita para PostgreSQL 18.4 (estável 18, manutenção 17), pgvector 0.8+, PostGIS 3.5+, pgbouncer 1.x e Patroni 3.x.