SRID 4326 और ज्यामिति
मिकट द्वारा उत्कृष्ट, व्यापक और वर्तमान उत्तर के लिए एक साइड नोट के रूप में । बहुत से लोग यह सवाल पूछते दिखते हैं क्योंकि वे SRINT को 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) )
जो कि सबसे सही तरीका है लेकिन crufty, या
- पाठ के उपयोग से निर्माण
ST_GeomFromText
, यह तार्किक रूप से धीमा है और इसे बेंचमार्क की आवश्यकता नहीं है: पोस्टग्रेजेक्यूएल को पाठ से निर्माता के तर्कों को पार्स करना होगा। यह खुद भी बेहद बदसूरत है।
काश, एक और तरीका है।
भूगोल प्रकार
डिफ़ॉल्ट 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
मूर्खतापूर्ण और धीमा है।