কোনও পোস্টজিআইএস ফাংশন কি বিদ্যমান টেবিলের জন্য জ্যামিতির প্রকার পরিবর্তন করতে পারে?
আমাদের POINT থেকে বহুভুক্তে পরিবর্তন করা দরকার।
যখন আমরা জ্যামিতির ধরণটি পরিবর্তন করব তখন টেবিলটি খালি থাকবে এবং আমরা কেবল টেবিলটি ড্রপ / তৈরি করতে পারি না।
কোনও পোস্টজিআইএস ফাংশন কি বিদ্যমান টেবিলের জন্য জ্যামিতির প্রকার পরিবর্তন করতে পারে?
আমাদের POINT থেকে বহুভুক্তে পরিবর্তন করা দরকার।
যখন আমরা জ্যামিতির ধরণটি পরিবর্তন করব তখন টেবিলটি খালি থাকবে এবং আমরা কেবল টেবিলটি ড্রপ / তৈরি করতে পারি না।
উত্তর:
PostGIS 2.x এর জন্য , আপনি একটি এক্সপ্রেশন ব্যবহার করে ALTER TABLE DDL ব্যবহার করতে পারেন ।
একক অংশ থেকে বহু-অংশ জ্যামিতিতে রূপান্তর করতে, ST_ মাল্টি ব্যবহার করুন :
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;