SRID 4326 и геометрия
В качестве примечания к отличному, всеобъемлющему и актуальному ответу MikeT . Многие люди задаются этим вопросом, потому что хотят установить SRID в столбце POINT.
CREATE TABLE foo ( geom geometry(Point,4326) );
Но когда они это делают, у них возникают проблемы с тем, что кажется лучшим способом создания точки, но, увы, они сталкиваются с проблемами.
INSERT INTO foo (geom) VALUES ( ST_MakePoint(1,2) );
ERROR: Geometry SRID (0) does not match column SRID (4326);
Оттуда они думают, что у них есть два варианта
- Установите SRID вручную,
ST_SetSRID( ST_MakePoint(1,2) )
что является самым правильным способом, но хитрым, или
- Построение из текста с использованием
ST_GeomFromText
, это логически медленнее и не требует тестов: PostgreSQL должен анализировать аргументы конструктора из текста. Это также чрезвычайно уродливо само по себе.
Увы, есть и другой путь.
Тип географии
SRID по умолчанию для geography
4326. Если вы новичок, я бы предложил использовать geography
вместо geometry
. На самом деле, как правило, если вы не знаете разницу, которую вы, вероятно, хотите geography
. Вы можете легко переключать столбцы.
BEGIN;
ALTER TABLE foo ADD COLUMN geog geography(point,4326);
UPDATE foo SET geog = geom::geography;
ALTER TABLE foo DROP COLUMN geom;
COMMIT;
Теперь вставка стала проще, потому что тип уже связан по умолчанию с SRID 4326. Теперь вы можете явно приводить к geography
или просто позволить неявному приведению работать
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
Который выглядит так, (они все вставляют одно и то же)
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 );
Преобразование в текст, а затем принуждение PostgreSQL к анализу текста с
ST_GeomFromText
или ST_GeogFromText
глупо и медленно.