SRID 4326 และเรขาคณิต
เป็นบันทึกทางด้านคำตอบที่ดีเยี่ยมครอบคลุมและในปัจจุบันโดย MikeT หลายคนดูเหมือนจะถามคำถามนี้เพราะต้องการตั้งค่า SRID ในคอลัมน์จุด
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) )
ซึ่งเป็นวิธีที่เหมาะสมที่สุด แต่ crufty หรือ
- สร้างจากการใช้ข้อความ
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
โง่และช้า