SRID 4326 i geometria
Na marginesie doskonałej, kompleksowej i aktualnej odpowiedzi MikeT . Wydaje się, że wiele osób zadaje to pytanie, ponieważ chce ustawić SRID w kolumnie POINT.
CREATE TABLE foo ( geom geometry(Point,4326) );
Ale kiedy to robią, mają problemy z najlepszą metodą tworzenia punktu, ale niestety wpadają w kłopoty.
INSERT INTO foo (geom) VALUES ( ST_MakePoint(1,2) );
ERROR: Geometry SRID (0) does not match column SRID (4326);
Stamtąd uważają, że mają dwie opcje
- Ustaw SRID ręcznie,
ST_SetSRID( ST_MakePoint(1,2) )
co jest najbardziej prawe, ale kruche, lub
- Konstruuj na podstawie tekstu
ST_GeomFromText
, jest to logicznie wolniejsze i nie wymaga testów porównawczych: PostgreSQL musi przeanalizować argumenty konstruktora z tekstu. Sam też jest wyjątkowo brzydki.
Niestety, istnieje inny sposób.
Typ geograficzny
Domyślny SRID dla geography
to 4326. Jeśli jesteś nowy, sugeruję użycie geography
zamiast geometry
. W zasadzie, jeśli nie znasz różnicy, której prawdopodobnie chcesz geography
. Możesz łatwo przełączać kolumny.
BEGIN;
ALTER TABLE foo ADD COLUMN geog geography(point,4326);
UPDATE foo SET geog = geom::geography;
ALTER TABLE foo DROP COLUMN geom;
COMMIT;
Teraz wstawianie jest łatwiejsze, ponieważ typ jest już domyślnie powiązany z SRID 4326. Teraz możesz jawnie rzutować na geography
, lub po prostu pozwolić, aby rzutowanie niejawne działało
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
Który wygląda tak (wszystkie wstawiają tę samą rzecz)
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 );
Konwersja na tekst, a następnie zmuszanie PostgreSQL do parsowania tekstu za pomocą
ST_GeomFromText
lub ST_GeogFromText
jest głupie i powolne.