SRID 4326 e Geometria
Como observação à excelente, abrangente e atual resposta de MikeT . Muitas pessoas parecem fazer essa pergunta porque desejam definir o SRID em uma coluna POINT.
CREATE TABLE foo ( geom geometry(Point,4326) );
Mas, quando o fazem, encontram problemas com o que parece ser o melhor método para criar um argumento, mas, infelizmente, encontram problemas.
INSERT INTO foo (geom) VALUES ( ST_MakePoint(1,2) );
ERROR: Geometry SRID (0) does not match column SRID (4326);
A partir daí, eles raciocinam que têm duas opções
- Defina o SRID manualmente,
ST_SetSRID( ST_MakePoint(1,2) )
que é o caminho mais à direita, mas com crosta, ou
- Construa a partir do texto usando
ST_GeomFromText
, isso é logicamente mais lento e não precisa de benchmarks: o PostgreSQL precisa analisar os argumentos do construtor a partir do texto. Também é extremamente feio em si.
Infelizmente, existe outro caminho.
Tipo de Geografia
O SRID padrão geography
é 4326. Se você é novo, sugiro usar em geography
vez de geometry
. De fato, geralmente se você não sabe a diferença que provavelmente deseja geography
. Você pode mudar as colunas facilmente.
BEGIN;
ALTER TABLE foo ADD COLUMN geog geography(point,4326);
UPDATE foo SET geog = geom::geography;
ALTER TABLE foo DROP COLUMN geom;
COMMIT;
Agora, a inserção é mais fácil porque o tipo já está associado ao padrão com o SRID 4326. Agora você pode converter explicitamente para geography
, ou apenas deixar a conversão implícita funcionar
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 parece com isso (todos eles inserem a mesma coisa)
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 );
Converter em texto e forçar o PostgreSQL a analisar o texto com
ST_GeomFromText
ou ST_GeogFromText
é bobo e lento.