SRID 4326 e geometria
Come nota a margine dell'eccellente, completa e attuale risposta di MikeT . Molte persone sembrano porre questa domanda perché vogliono impostare lo SRID su una colonna POINT.
CREATE TABLE foo ( geom geometry(Point,4326) );
Ma quando lo fanno incontrano problemi con quello che sembra il metodo migliore per creare un punto, ma purtroppo si trovano in difficoltà.
INSERT INTO foo (geom) VALUES ( ST_MakePoint(1,2) );
ERROR: Geometry SRID (0) does not match column SRID (4326);
Da lì, pensano di avere due opzioni
- Impostare manualmente l'SRID,
ST_SetSRID( ST_MakePoint(1,2) )
che è il modo più giusto ma crufty, o
- Costruisci usando il testo
ST_GeomFromText
, questo è logicamente più lento e non ha bisogno di parametri di riferimento: PostgreSQL deve analizzare gli argomenti del costruttore dal testo. È anche estremamente brutto stesso.
Ahimè, c'è un altro modo.
Tipo di geografia
L'SRID predefinito per geography
è 4326. Se sei nuovo, suggerirei di utilizzare geography
invece di geometry
. In effetti, generalmente se non conosci la differenza che probabilmente desideri geography
. Puoi cambiare le colonne abbastanza facilmente.
BEGIN;
ALTER TABLE foo ADD COLUMN geog geography(point,4326);
UPDATE foo SET geog = geom::geography;
ALTER TABLE foo DROP COLUMN geom;
COMMIT;
Ora l'inserimento è più semplice perché il tipo è già associato per impostazione predefinita a SRID 4326. Ora è possibile eseguire il cast esplicito geography
o semplicemente consentire al cast implicito di funzionare
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
Che assomiglia a questo, (tutti inseriscono la stessa cosa)
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 conversione in testo e quindi forzare PostgreSQL a analizzare il testo con
ST_GeomFromText
o ST_GeogFromText
è sciocco e lento.