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
Як виглядає так, (всі вони вставляють hte одне і те ж)
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
безглуздо і повільно.