SRID 4326 y Geometría
Como nota al margen de la excelente, completa y actual respuesta de MikeT . Muchas personas parecen hacer esta pregunta porque quieren establecer el SRID en una columna POINT.
CREATE TABLE foo ( geom geometry(Point,4326) );
Pero cuando lo hacen, se topan con problemas con lo que parece ser el mejor método para crear un punto, pero lamentablemente se topan con problemas.
INSERT INTO foo (geom) VALUES ( ST_MakePoint(1,2) );
ERROR: Geometry SRID (0) does not match column SRID (4326);
A partir de ahí, razonan que tienen dos opciones
- Establezca el SRID manualmente,
ST_SetSRID( ST_MakePoint(1,2) )
que es la forma más correcta pero crujiente, o
- Construir a partir de texto usando
ST_GeomFromText
, esto es lógicamente más lento y no necesita puntos de referencia: PostgreSQL tiene que analizar los argumentos del constructor a partir del texto. También es extremadamente feo en sí mismo.
Por desgracia, hay otra manera.
Tipo de geografía
El SRID predeterminado para geography
es 4326. Si es nuevo, sugeriría usar en geography
lugar de geometry
. De hecho, generalmente si no conoce la diferencia que probablemente quiera geography
. Puede cambiar las columnas con bastante facilidad.
BEGIN;
ALTER TABLE foo ADD COLUMN geog geography(point,4326);
UPDATE foo SET geog = geom::geography;
ALTER TABLE foo DROP COLUMN geom;
COMMIT;
Ahora la inserción es más fácil porque el tipo ya está asociado por defecto con SRID 4326. Ahora puede convertir explícitamente geography
o simplemente dejar que la conversión implícita funcione
ST_MakePoint(x,y) -- implicit cast and srid
ST_MakePoint(x,y)::geography -- explicit cast, implicit srid
ST_SetSRID( ST_MakePoint(3,4), 4326 ) -- explicit cast and srid
Que se ve así, (todos insertan lo mismo)
INSERT INTO foo (geog) VALUES
-- implicit cast and SRID
( ST_MakePoint(1,2) ),
-- explicit cast, implicit SRID
( ST_MakePoint(1,2)::geography ),
-- explicit cast and SRID
( ST_SetSRID( ST_MakePoint(3,4), 4326 )::geography );
La conversión a texto y luego obliga a PostgreSQL a analizar el texto con
ST_GeomFromText
o ST_GeogFromText
es tonto y lento.