SRID 4326 et géométrie
En guise de note complémentaire à l'excellente, complète et actuelle réponse de MikeT . Beaucoup de gens semblent poser cette question car ils veulent définir le SRID sur une colonne POINT.
CREATE TABLE foo ( geom geometry(Point,4326) );
Mais quand ils le font, ils rencontrent des problèmes avec ce qui semble être la meilleure méthode pour créer un point, mais malheureusement, ils rencontrent des problèmes.
INSERT INTO foo (geom) VALUES ( ST_MakePoint(1,2) );
ERROR: Geometry SRID (0) does not match column SRID (4326);
De là, ils pensent avoir deux options
- Définissez le SRID manuellement,
ST_SetSRID( ST_MakePoint(1,2) )
ce qui est la manière la plus à droite mais cruelle, ou
- Construire à partir de texte en utilisant
ST_GeomFromText
, c'est logiquement plus lent et n'a pas besoin de repères: PostgreSQL doit analyser les arguments du constructeur à partir du texte. C'est aussi extrêmement laid lui-même.
Hélas, il existe un autre moyen.
Type de géographie
Le SRID par défaut geography
est 4326. Si vous êtes nouveau, je suggère d'utiliser à la geography
place de geometry
. En fait, généralement si vous ne connaissez pas la différence que vous voulez probablement geography
. Vous pouvez changer les colonnes assez facilement.
BEGIN;
ALTER TABLE foo ADD COLUMN geog geography(point,4326);
UPDATE foo SET geog = geom::geography;
ALTER TABLE foo DROP COLUMN geom;
COMMIT;
L'insertion est désormais plus facile car le type est déjà associé par défaut au SRID 4326. Vous pouvez désormais effectuer un cast explicite vers geography
, ou simplement laisser le cast implicite fonctionner
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
Qui ressemble à ceci, (ils insèrent tous la même chose)
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 );
Convertir en texte puis forcer PostgreSQL à analyser le texte avec
ST_GeomFromText
ou ST_GeogFromText
est stupide et lent.