SRID 4326 und Geometrie
Als Randnotiz zu der hervorragenden, umfassenden und aktuellen Antwort von MikeT . Viele Leute scheinen diese Frage zu stellen, weil sie die SRID auf eine POINT-Spalte setzen wollen.
CREATE TABLE foo ( geom geometry(Point,4326) );
Aber wenn sie dies tun, stoßen sie auf Probleme mit der scheinbar besten Methode, um einen Punkt zu erstellen, aber leider stoßen sie auf Probleme.
INSERT INTO foo (geom) VALUES ( ST_MakePoint(1,2) );
ERROR: Geometry SRID (0) does not match column SRID (4326);
Aus diesem Grund haben sie zwei Möglichkeiten
ST_SetSRID( ST_MakePoint(1,2) )
Stellen Sie die SRID manuell ein. Dies ist die am weitesten rechts stehende, aber unangenehme Einstellung
- Konstruieren Sie aus Text mit
ST_GeomFromText
, dies ist logisch langsamer und benötigt keine Benchmarks: PostgreSQL muss die Argumente des Konstruktors aus dem Text analysieren. Es ist auch selbst extrem hässlich.
Leider gibt es einen anderen Weg.
Geografietyp
Die Standard-SRID für geography
ist 4326. Wenn Sie neu sind, würde ich die Verwendung von geography
anstelle von vorschlagen geometry
. In der Tat, im Allgemeinen, wenn Sie den Unterschied nicht kennen, den Sie wahrscheinlich wollen geography
. Sie können die Spalten ziemlich einfach wechseln.
BEGIN;
ALTER TABLE foo ADD COLUMN geog geography(point,4326);
UPDATE foo SET geog = geom::geography;
ALTER TABLE foo DROP COLUMN geom;
COMMIT;
Das Einfügen ist jetzt einfacher, da der Typ bereits standardmäßig mit SRID 4326 verknüpft ist. Jetzt können Sie explizit in geography
die implizite Umwandlung umwandeln oder sie einfach arbeiten lassen
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
Was so aussieht (alle fügen das Gleiche ein)
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 );
In Text konvertieren und dann PostgreSQL zwingen, den Text mit ST_GeomFromText
oder zu analysieren,
ST_GeogFromText
ist albern und langsam.