Geometry vs Geography
La geometry de PostGIS utiliza matemáticas planas en un sistema de coordenadas proyectado. geography utiliza un modelo esferoide en WGS84 para distancias geodésicas en metros. Elige el tipo que coincida con tu SRID y tus necesidades de precisión de distancia.
Receta
-- Misma lon/lat, diferentes tipos
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;
-- Distancia NYC a 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;Cuándo usar esto: Al elegir tipos de columna para tablas nuevas, depurar errores de distancia u optimizar índices para ST_DWithin.
Ejemplo de Trabajo
CREATE TABLE delivery_zones (
id serial PRIMARY KEY,
name text,
-- Polígono a escala de ciudad: UTM local para matemáticas de geometría precisas
zone_geom extensions.geometry(Polygon, 32618), -- UTM 18N para el área de NYC
-- Consultas de ubicación del conductor: geografía para radio en metros desde GPS
service_geog extensions.geography(Polygon, 4326)
);
-- Almacenar ambos cuando sea necesario: geometría para editar en proyección local,
-- geografía para consultas "dentro de 2 km del conductor"
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
);Lo que esto demuestra:
geometryproyectada localmente para polígonos de planificación urbanageographypara filtros de radio GPS en metros- GiST en geografía soporta
ST_DWithin - Los modelos mixtos son válidos cuando las transformaciones están documentadas
Análisis Profundo
Tabla Comparativa
| Aspecto | geometry | geography |
|---|---|---|
| Sistema de coordenadas | Proyectado (metros en plano) | Esferoide WGS84 |
| Unidades de distancia | Unidades del mapa (metros si está proyectado) | Metros en el esferoide |
| Rendimiento | Más rápido para áreas locales | Más lento, más preciso globalmente |
| Funciones | Suite plana completa | Subconjunto; a menudo se necesitan conversiones de tipo |
| SRID | Debe ser proyectado para matemáticas en metros | Típicamente 4326 |
Referencia Rápida de SRID
| SRID | Nombre | Uso |
|---|---|---|
| 4326 | WGS84 lat/lon | GPS, mapas web, geografía |
| 3857 | Web Mercator | Solo para visualización; pobre para distancias |
| 32618 | UTM 18N | Trabajo plano en la región de NYC |
| 0 | Desconocido | Evitar en producción |
SELECT srid, auth_name, auth_srid, srtext
FROM spatial_ref_sys
WHERE srid IN (4326, 3857, 32618);Transformaciones
-- Reproyectar geometría entre SRIDs
SELECT extensions.ST_Transform(
extensions.ST_SetSRID(extensions.ST_MakePoint(-73.9857, 40.7484), 4326),
32618
);
-- Geografía a partir de geometría (solo 4326 para la conversión a geog)
SELECT extensions.ST_SetSRID(extensions.ST_MakePoint(-73.9857, 40.7484), 4326)::extensions.geography;Consideraciones de Índices
- GiST funciona tanto en geometría como en geografía.
- Usa geometría con proyección local correcta para superposiciones de polígonos grandes (más rápido).
- Usa geografía para radios de metros consistentes en entradas lat/lon sin matemáticas de proyección en la aplicación.
Trampas Comunes
- Distancia de geometría 4326 en metros -
ST_Distanceen geometría 4326 devuelve grados. Solución: Convertir a geografía o transformar a UTM. - 3857 para análisis - Web Mercator distorsiona el área y la distancia. Solución: 3857 solo para teselas; almacena 4326 o UTM local.
- Inserción SRID 0 -
ST_GeomFromText('POINT(0 0)')sin SRID. Solución: Eltypmodgeometry(Point,4326)rechaza SRIDs incorrectos cuando se aplica. - Geografía en no-4326 - Soporte limitado; resultados incorrectos. Solución: Transformar a 4326 antes de la conversión a geografía.
- Mezcla de tipos en ST_Intersects - Sorpresas por conversión implícita. Solución: Conversión explícita y documentación del pipeline.
- Polos y línea de fecha - La geografía los maneja; polígonos incorrectos en geometría ingenua. Solución: Validar con
ST_IsValid.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| geometry + UTM | Región fija de ciudad/condado | Consultas de roaming global |
| Solo geography | Aplicaciones simples de radio GPS | Problemas de rendimiento en superposición de polígonos pesados |
| Haversine en la aplicación | Distancia única | Se necesitan uniones espaciales e índices |
| Teselas ráster | Mapas solo de visualización | Almacenamiento de características vectoriales |
Preguntas Frecuentes
¿Qué tipo para el radio de entrega?
geography en 4326 para ST_DWithin en metros desde puntos GPS.¿Almacenamiento de polígonos?
Ciudad local: geometría proyectada. Áreas de servicio globales: geografía o divisiones UTM multizona.¿Unidades de ST_Length?
geometry: unidades del mapa; geography: metros en el esferoide.¿Cálculos de área?
Usar la proyección adecuada; el área de geografía se basa en el esferoide.¿Aplicación de Typmod?
geometry(Point,4326) rechaza inserciones de SRID incorrectas en PostGIS recientes.¿Consejo de rendimiento?
El operador de caja delimitadora && en las conversiones de geometría a geografía utiliza el prefiltro del índice.¿EWKT?
SRID=4326;POINT(...) en COPY para ingesta explícita de SRID.¿Geografía 3D?
Raro; generalmente se descarta la Z para aplicaciones web.¿Exportación de QGIS?
Hacer coincidir el SRID en la configuración de exportación con el typmod de la columna.¿Pruebas?
Pares de distancias conocidos (NYC-LA ~3935 km) para verificar las consultas.Relacionados
- Conceptos Básicos de PostGIS - PostGIS vs teselas
- Índices Espaciales - uso de GiST
- Rendimiento de PostGIS - prefiltro de límites
- Tipos de Datos JSONB - patrones compuestos
- Mejores Prácticas de PostGIS - SRID en cada geometría
Versiones de la Pila: Esta página fue escrita para PostgreSQL 18.4 (estable 18, mantenimiento 17), pgvector 0.8+, PostGIS 3.5+, pgbouncer 1.x, y Patroni 3.x.