PostGIS में मौजूदा तालिका के भीतर पॉइंट से मल्टीपॉइंट में ज्यामिति प्रकार बदलना?


31

क्या एक PostGIS फ़ंक्शन है जो किसी मौजूदा तालिका के लिए ज्यामिति प्रकार बदल सकता है?

हमें POINT से MULTIPOINT तक बदलना होगा।

जब हम ज्यामिति प्रकार बदलते हैं तो तालिका खाली हो जाएगी और हम तालिका को केवल ड्रॉप / क्रिएट नहीं कर सकते।

जवाबों:


62

PostGIS 2.x के लिए , आप एक अभिव्यक्ति का उपयोग करके ALTER TABLE DDL का उपयोग कर सकते हैं

एकल-भाग से बहु-भाग ज्यामिति में परिवर्तित करने के लिए, ST_Multi का उपयोग करें :

ALTER TABLE my_table
    ALTER COLUMN geom TYPE geometry(MultiPoint,4326) USING ST_Multi(geom);

बहु-भाग से एकल-भाग ज्यामिति में परिवर्तित करने के लिए, यह थोड़ा अधिक कठिन है क्योंकि आप केवल एक भाग का उपयोग कर सकते हैं, और अन्य सभी भागों (यदि वे मौजूद हैं) को अनदेखा कर सकते हैं। अपना डेटा पहले देखें कि क्या आपके पास एक से अधिक भाग के साथ कुछ ज्यामिति हैं:

SELECT COUNT(CASE WHEN ST_NumGeometries(geom) > 1 THEN 1 END) AS multi_geom,
       COUNT(geom) AS total_geom
FROM my_table;

यदि आप multi_geom0 से अधिक देखते हैं , तो आप डेटा खोने का जोखिम लेंगे, और आपको इसे बहु-भाग ज्यामिति के रूप में रखना चाहिए। यदि आप 0 देखते हैं, तो यह एकल-भाग ज्यामिति में बनाना सुरक्षित है:

ALTER TABLE my_table
    ALTER COLUMN geom TYPE geometry(Point,4326) USING ST_GeometryN(geom, 1);

PostGIS 1.x के लिए , यह थोड़ा अधिक गड़बड़ है, क्योंकि कई चरण हैं (धन्यवाद @ rec.thegeom!)।

तालिका my_tableऔर ज्यामिति कॉलम को मानते हुए geom, यहां बहु-भाग में बदलने के चरण दिए गए हैं:

-- 1. Remove the geom_type constraint (if existing)
ALTER TABLE my_table DROP CONSTRAINT enforce_geotype_geom;

-- 2. Update the geometry data to multi-part -- skip if it is an empty table
UPDATE my_table SET geom = ST_Multi(geom);

-- 3. Re-add a different geometry constraint for the new type
ALTER TABLE my_table ADD CONSTRAINT enforce_geotype_geom
  CHECK (geometrytype(geom) = 'MULTIPOINT'::text OR geom IS NULL);

-- 4. Update the geometry_columns metadata table
UPDATE geometry_columns SET type = 'MULTIPOINT'
WHERE f_table_schema = 'public' AND f_table_name = 'my_table' AND f_geometry_column = 'geom';

हाय @ माय टोज़ (और उलरिक)। मुझे नहीं लगता कि PostGIS 1.x के लिए आपका दूसरा कदम इस मामले में आवश्यक है, माइक। उलरिक ने कहा कि प्रकार के रूपांतरण के समय तालिका खाली हो जाएगी, इसलिए किसी भी तरह की त्रुटि के कारण कोई भी गैर-बहु मान नहीं होगा: 1) टाइप करें my_table DROP CONSTRAINT enforce_geotyp_the-geom; 2) इसके अलावा my_table ADD CONSTRAINT enforce_geotype_the_geom CHECK (ज्यामिति) (the_geom) = 'MULTIPOINT' :: पाठ या the_geom IS पूर्ण); फिर 3) अद्यतन ज्योमेट्री_कालेमेंट SET प्रकार = 'MULTIPOINT' जहां f_table_name = 'my_table'; (शायद सबसे खराब टिप्पणी - मेरा बुरा)
rec.thegeom

@ rec.thegeom सही; एक खाली तालिका के साथ अद्यतन करने के लिए कुछ भी नहीं होगा। वास्तविक आदेशों को पोस्ट करने के लिए धन्यवाद!
माइक टी।

यदि आपके पास विभिन्न रूपों में जटिल डेटा है, GEOMETRYCOLLECTION (MULTIPOLYGON(...))तो आप एक से अधिक ज्यामिति का पता लगाने के लिए क्वेरी को बदलना चाह सकते हैं। चेक के साथ ST_NumGeometries(ST_CollectionHomogenize(geom)) > 1और इसके साथ समान चीज़ का उपयोग करें USING: ST_GeometryN(ST_Multi(ST_CollectionHomogenize (geom)), 1)या समान।
रावबेकर

4

बदलें, मुझे ऐसा नहीं लगता। लेकिन आप समान संरचना के साथ एक नई तालिका बना सकते हैं, जियोम कॉलम को छोड़कर, फिर चलाएं:

SELECT AddGeometryColumn('new-pt_table','geom',<SRID>,'MULTIPOINT',2);

INSERT INTO new_pt_table (attr1, attr2, attr3, ..., geom) 
SELECT attr1, attr2, attr3, ... , ST_Multi(geom) FROM old_pt_table;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.