2012-04-18 14 views
13

मैं अपनी तालिका में डेटा आयात करने के लिए STDIN से कॉपी का उपयोग करने का प्रयास कर रहा हूं। मेरी तालिका में कॉलम में से एक प्रकार ज्यामिति है। मेरे आदेश कुछ इस तरह दिखता ...STDIN अभिव्यक्तियों से PostgreSQL कॉपी

COPY "WeatherStations" ("Station_ID", "Station_Code", "Station_Name", "Station_Location") FROM stdin; 
1  KAVP WILKES-BARRE ST_GeomFromText('POINT(41.338055 -75.724166)') 
2  KOKV WINCHESTER  ST_GeomFromText('POINT(39.143333 -78.144444)') 
3  KSHD SHENANDOAH  ST_GeomFromText('POINT(38.263611 -78.896388)') 
... 

हालांकि, मुझे लगता है कि यह पाठ सम्मिलित करने के लिए प्रयास कर रहा है "ST_GeomFromText ('सूत्री ..." और नाकाम रहने के बजाय अभिव्यक्ति का मूल्यांकन करने और अभिव्यक्ति का परिणाम डालने । किसी को भी पता है क्या यहाँ पर जा रहा हो सकता है और मैं वास्तविक geoms डाला कैसे प्राप्त कर सकते हैं

उत्तर

25

मैं पता लगाना कैसे STDIN आदेश की प्रतिलिपि का उपयोग कर PostGIS में थोक कॉपी/लोड ज्यामिति डेटा के लिए, मैं इस विषय पर आधिकारिक दस्तावेज नहीं मिल सका एक बुरा समय था।

थोक लोड (the ALTER TABLE/SET DATA TYPE/USING) के दौरान स्तंभ फेरबदल क्योंकि यह ज्यामिति प्रकार के लिए only supported in PostGIS 2.0+ है मेरे लिए एक विकल्प नहीं था और न ही स्वीकार्य use of a temporary table था।

वास्तव में ऐसा करने का एक सीधा तरीका है (कम से कम पोस्टजीआईएस 1.5.2+ में)। आप बस इस तरह से अपनी कॉपी बयान के लिए डेटा को फिर से लिखने सकते हैं, अपने ज्यामिति डेटा के लिए एक सरल वाली WKT- (प्रसिद्ध पाठ) प्रतिनिधित्व का उपयोग कर:

1  KAVP WILKES-BARRE POINT(41.338055 -75.724166) 
2  KOKV WINCHESTER  POINT(39.143333 -78.144444) 
3  KSHD SHENANDOAH  POINT(38.263611 -78.896388) 

आप ज्यामिति स्तंभ आप 'पर एक SRID बाधा लागू किया है (इस उदाहरण में SRID 4326 है) निम्न सिंटैक्स का उपयोग करने के लिए होगा EWKT के रूप में जाना (विस्तारित अच्छी ज्ञात पाठ है, जो एक PostGIS specific format):

1  KAVP WILKES-BARRE SRID=4326;POINT(41.338055 -75.724166) 
2  KOKV WINCHESTER  SRID=4326;POINT(39.143333 -78.144444) 
3  KSHD SHENANDOAH  SRID=4326;POINT(38.263611 -78.896388) 

समापन ध्यान दें: वहाँ "सूत्री के बीच कोई अंतराल होना चाहिए "और उद्घाटन कोष्ठक" (", या COPY अभी भी त्रुटि लौटाएगा कि आपका ज्यामिति डेटा एक अवैध प्रारूप है।

+2

घर पर खेलने वाले किसी भी व्यक्ति के लिए, यह सीएसवी के लिए 'कॉपी से' के लिए भी काम करेगा। यह पोस्टजीआईएस में बेहतर दस्तावेज होना चाहिए। यह आपको आपकी पोस्ट खोजने के लिए दोपहर का बेहतर हिस्सा ले गया। आपके योगदान के लिए बहुत बहुत धन्यवाद। – apocryphalauthor

+0

अभी भी 2017 में मान्य है। कम से कम मैं 'आकार के' धीमे 'wkb_hex' फ़ंक्शन से बच सकता हूं। – Michael

-1

प्वाइंट के मूल्य इस तरह दिखता है:?। 0101000020E6100000DA722EC555552B40CDCCCCCCCC0C4840

मैं आम तौर पर latitude और longitude कॉलम मेरी टेबल में रखने के लिए और स्थानिक निर्माण ट्रिगर्स के साथ डेटा।

मुझे नहीं पता कि अन्यथा stdin से POINT एस कैसे कॉपी करें।

2

आप पाठ को लपेटने वाले फ़ंक्शन को छोड़ सकते हैं, टेक्स्ट कॉलम के साथ एक अस्थायी तालिका में आयात कर सकते हैं, और फिर उस चरण में रूपांतरण करने वाले फ़ंक्शन के साथ स्थायी तालिका में INSERT/SELECT चला सकते हैं।

INSERT INTO "WeatherStations" 
    ("Station_ID", "Station_Code", "Station_Name", "Station_Location") 
    SELECT "Station_ID", "Station_Code", "Station_Name", 
     ST_GeomFromText("Station_Location") 
    FROM "TempWeatherStations"; 
+0

यह मूल रूप से मैं क्या कर रहा हूं। मैं डेटा को एक टेक्स्ट कॉलम में जोड़ता हूं, एक अस्थायी ज्यामिति कॉलम बनाता हूं, डेटा को परिवर्तित करता हूं, फिर पुराने कॉलम को छोड़ देता हूं और नया नाम बदलता हूं। सबसे सुंदर नहीं है, लेकिन यह काम करता है। – denaje

+1

यदि आप इसे एक तालिका में करने जा रहे हैं, तो आप सोचते हैं कि प्रक्रिया के लिए यूएसआईंग क्लॉज का उपयोग करके कॉलम प्रकार को बदलकर थोड़ा सा प्रक्रिया सरल हो सकती है .. – kgrittn

+0

एल्टर टेबल/सेट डेटा प्रकार/उपयोग के बारे में नहीं पता था वाक्य - विन्यास! कॉलम जोड़ने और हटाने से बहुत सुंदर है। – denaje

संबंधित मुद्दे