SRID 4326 và Hình học
Như một lưu ý phụ cho câu trả lời xuất sắc, toàn diện và hiện tại của MikeT . Nhiều người dường như hỏi câu hỏi này vì họ muốn đặt SRID trên cột POINT.
CREATE TABLE foo ( geom geometry(Point,4326) );
Nhưng khi họ làm họ gặp vấn đề với những gì có vẻ như là phương pháp tốt nhất để tạo điểm, nhưng than ôi họ gặp rắc rối.
INSERT INTO foo (geom) VALUES ( ST_MakePoint(1,2) );
ERROR: Geometry SRID (0) does not match column SRID (4326);
Từ đó, họ lý do họ có hai lựa chọn
- Đặt SRID theo cách thủ công,
ST_SetSRID( ST_MakePoint(1,2) )
đó là cách đúng nhất nhưng cực kỳ hay
- Xây dựng từ văn bản bằng cách sử dụng
ST_GeomFromText
, điều này chậm hơn về mặt logic và không cần điểm chuẩn: PostgreQuery phải phân tích các đối số của hàm tạo từ văn bản. Bản thân nó cũng cực kỳ xấu xí.
Than ôi, có một cách khác.
Loại địa lý
SRID mặc định cho geography
là 4326. Nếu bạn là người mới, tôi sẽ đề xuất sử dụng geography
thay vì geometry
. Trên thực tế, nói chung nếu bạn không biết sự khác biệt mà bạn có thể muốn geography
. Bạn có thể chuyển đổi các cột khá dễ dàng.
BEGIN;
ALTER TABLE foo ADD COLUMN geog geography(point,4326);
UPDATE foo SET geog = geom::geography;
ALTER TABLE foo DROP COLUMN geom;
COMMIT;
Bây giờ việc chèn trở nên dễ dàng hơn vì loại này đã được liên kết mặc định với SRID 4326. Bây giờ bạn có thể chuyển sang một cách rõ ràng geography
hoặc chỉ để cho phép truyền ẩn hoạt động
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
Trông giống như thế này, (tất cả đều chèn hte cùng một thứ)
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 );
Chuyển đổi thành văn bản và sau đó buộc PostgreSQL phân tích văn bản bằng
ST_GeomFromText
hoặc ST_GeogFromText
là ngớ ngẩn và chậm chạp.