क्या एक PostGIS फ़ंक्शन है जो किसी मौजूदा तालिका के लिए ज्यामिति प्रकार बदल सकता है?
हमें POINT से MULTIPOINT तक बदलना होगा।
जब हम ज्यामिति प्रकार बदलते हैं तो तालिका खाली हो जाएगी और हम तालिका को केवल ड्रॉप / क्रिएट नहीं कर सकते।
क्या एक PostGIS फ़ंक्शन है जो किसी मौजूदा तालिका के लिए ज्यामिति प्रकार बदल सकता है?
हमें POINT से MULTIPOINT तक बदलना होगा।
जब हम ज्यामिति प्रकार बदलते हैं तो तालिका खाली हो जाएगी और हम तालिका को केवल ड्रॉप / क्रिएट नहीं कर सकते।
जवाबों:
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_geom
0 से अधिक देखते हैं , तो आप डेटा खोने का जोखिम लेंगे, और आपको इसे बहु-भाग ज्यामिति के रूप में रखना चाहिए। यदि आप 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';
GEOMETRYCOLLECTION (MULTIPOLYGON(...))
तो आप एक से अधिक ज्यामिति का पता लगाने के लिए क्वेरी को बदलना चाह सकते हैं। चेक के साथ ST_NumGeometries(ST_CollectionHomogenize(geom)) > 1
और इसके साथ समान चीज़ का उपयोग करें USING
: ST_GeometryN(ST_Multi(ST_CollectionHomogenize (geom)), 1)
या समान।
बदलें, मुझे ऐसा नहीं लगता। लेकिन आप समान संरचना के साथ एक नई तालिका बना सकते हैं, जियोम कॉलम को छोड़कर, फिर चलाएं:
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;