পোস্টজিআইএস-এ বিদ্যমান টেবিলের মধ্যে জ্যামিতির ধরণটি পয়েন্ট থেকে মাল্টিপয়েন্টে পরিবর্তন করছেন?


31

কোনও পোস্টজিআইএস ফাংশন কি বিদ্যমান টেবিলের জন্য জ্যামিতির প্রকার পরিবর্তন করতে পারে?

আমাদের POINT থেকে বহুভুক্তে পরিবর্তন করা দরকার।

যখন আমরা জ্যামিতির ধরণটি পরিবর্তন করব তখন টেবিলটি খালি থাকবে এবং আমরা কেবল টেবিলটি ড্রপ / তৈরি করতে পারি না।

উত্তর:


62

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_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';

হাই @ মাইক টুউজ (এবং উলরিক) মাইকে এই ক্ষেত্রে পোস্টজিআইএস ১.x এর জন্য আপনার দ্বিতীয় পদক্ষেপ প্রয়োজনীয় বলে আমি মনে করি না। উলরিক বলেছিলেন ধরণের রূপান্তরকরণের সময় সারণীটি খালি থাকবে, সুতরাং কোনওরকম কোনও ত্রুটি ঘটানোর জন্য কোনও বহু-বহিরাগত মান থাকবে না: 1) টেবিলটি আমার_সামগ্রী ড্রপ চুক্তিটি প্রয়োগ করুন_জোটাইপ_সে_জুম; 2) টেবিল My_table এন্টি কনট্রন্টের প্রয়োগ করুন_জোটাইপ_থ_জম চেক (জ্যামিতি টাইপ (the_geom) = 'মাল্টিপয়েন্ট) :: পাঠ্য বা দ্য_জিয়ামটি শূন্য); তারপরে 3) জ্যামিতি_কলামগুলি আপডেট করুন SET প্রকার = 'বহুপথ' যেখানে f_table_name = 'আমার_সারণী'; (সম্ভবত স্লোপিস্টেস্ট মন্তব্য - আমার খারাপ)
rec.thegeom

@ rec.thegeom সঠিক; খালি টেবিলের সাথে আপডেট করার মতো কিছুই থাকবে না। প্রকৃত আদেশগুলি পোস্ট করার জন্য ধন্যবাদ!
মাইক টি

আপনার যদি বিভিন্ন আকারে জটিল ডেটা থাকে GEOMETRYCOLLECTION (MULTIPOLYGON(...))তবে আপনি একাধিক জ্যামিতির সনাক্তকরণের জন্য কোয়েরিটি পরিবর্তন করতে চাইতে পারেন। এর সাথে: বা অনুরূপের মতো চেক ST_NumGeometries(ST_CollectionHomogenize(geom)) > 1এবং অনুরূপ জিনিস ব্যবহার করুন । USINGST_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;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.