পোস্টজিআইএস-এ অতিরিক্ত জ্যামিতি কলাম যুক্ত করা হচ্ছে?


10

আমি পোস্ট জিআইএসে জিওডাটের অনেকগুলি সেট আমদানি করছি এবং তাদের আলাদা আলাদা SRID। (কিছু আছে EPSG:3857, কিছু আছে , কিছু EPSG:4326অন্য কিছু)।

আমি একটি অতিরিক্ত তৈরি করতে চাই geometry column, উদা। the_geom_mercatorসহ SRID EPSG:3857এবং মূল geomকলামটি যা আসুক তাতে SRIDরাখুন।

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

উত্তর:


18

বিদ্যমান সারণীতে একটি কলাম যুক্ত করতে, ALTER TABLE DDL ব্যবহার করুন , যেমন:

ALTER TABLE my_table
  ADD COLUMN the_geom_mercator
    geometry(Geometry,3857);

যা ব্যবহার করে অন্য কলাম (the_geom) থেকে পপুলেট করা যায়:

UPDATE my_table SET
  the_geom_mercator = ST_Transform(the_geom, 3857)
FROM spatial_ref_sys
WHERE ST_SRID(the_geom) = srid;

(তৃতীয় লাইনটি FROM spatial_ref_sys ...প্রয়োজনীয় নয়, তবে এটি অজানা বা অবৈধ অনুমানের সাহায্যে প্রয়াসকে রক্ষা করে যা ত্রুটি বাড়ায়)।

এবং যদি এই টেবিলটি বজায় রাখতে হয় (যুক্ত / আপডেট করা হয়), আপনি _geom_mercator আপডেট করতে একটি ট্রিগার ফাংশন ব্যবহার করতে পারেন, যেমন:

CREATE OR REPLACE FUNCTION my_table_tg_fn() RETURNS trigger AS
$BODY$BEGIN
  IF TG_OP = 'INSERT' AND NEW.the_geom ISNULL THEN
    RETURN NEW; -- no new geometry
  ELSIF TG_OP = 'UPDATE' THEN
    IF NEW.the_geom IS NOT DISTINCT FROM OLD.the_geom THEN
      RETURN NEW; -- same old geometry
    END IF;
  END IF;
  -- Attempt to transform a geometry
  BEGIN
    NEW.the_geom_mercator := ST_Transform(NEW.the_geom, 3857);
  EXCEPTION WHEN SQLSTATE 'XX000' THEN
    RAISE WARNING 'the_geom_mercator not updated: %', SQLERRM;
  END;
  RETURN NEW;
END;$BODY$ LANGUAGE plpgsql;

CREATE TRIGGER my_table_tg BEFORE INSERT OR UPDATE
   ON my_table FOR EACH ROW
   EXECUTE PROCEDURE my_table_tg_fn();

নোট করুন যে ST_Transfor ত্রুটিগুলি ফাঁদে ফেলে একটি সতর্কতা দেখা উচিত, যেমন:

postgis=# INSERT INTO my_table(the_geom)
postgis-# VALUES (ST_SetSRID(ST_MakePoint(0,1), 123))
postgis-# RETURNING the_geom, the_geom_mercator;
WARNING:  the_geom_mercator not updated: GetProj4StringSPI: Cannot find SRID (123) in spatial_ref_sys
-[ RECORD 1 ]-----+---------------------------------------------------
the_geom          | 01010000207B0000000000000000000000000000000000F03F
the_geom_mercator |

INSERT 0 1

একটি দুর্দান্ত উত্তরের জন্য ধন্যবাদ। এটি ট্রিগারগুলি ব্যবহার করার জন্য আসল ঝরঝরে, আমি এটি করা শুরু করব। আমি কি পরিবর্তে ডাটাবেসে সেই ট্রিগারটি যুক্ত করতে পারি, যাতে প্রতিটি নতুন টেবিলের জন্য এই ট্রিগারটি যুক্ত করতে না পারি?
নটোল

আমি পোস্টগ্রিসের সাথে ডেটা যুক্ত করছি shp2psqlএবং পাইপ দেওয়া হয়ে গেলে টেবিল তৈরি হয় psql। সুতরাং আমি টেবিলের অস্তিত্বের আগে সত্যিই একটি ট্রিগার যুক্ত করতে পারি না?
নটোল

1
আপনি shp2pgsql ব্যবহার করছেন, একটি আপডেট বিবৃতি ব্যবহার করুন, উপরে দেখুন। একটি সারণী দরকারী যদি আপনার কোনও টেবিল বজায় রাখা দরকার তবে লোডিংয়ের জন্য নয়।
মাইক টি

2

প্রথমে একটি সাধারণ অ-স্থানীয় টেবিল তৈরি করুন, যা আপনার ইতিমধ্যে রয়েছে। দ্বিতীয়টি ওপেনজিআইএস "অ্যাডজিওমিট্রি কলম" ফাংশনটি ব্যবহার করে টেবিলটিতে একটি স্থানিক কলাম যুক্ত করুন।

উদাহরণ:

CREATE TABLE terrain_points ( 
ogc_fid serial NOT NULL, 
elevation double precision,
);

SELECT AddGeometryColumn('terrain_points', 'wkb_geometry', 3725, 'POINT', 3 );

1

নেটিভ ফর্মটি ধরে রাখতে এবং একটি বিদ্যমানটিতে রূপান্তর করতে আপনি একটি নিয়ন্ত্রণহীন এসআরআইডি জ্যামিতি কলাম তৈরি করতে পারেন। এখানে একটি স্বতন্ত্র উদাহরণ হিসাবে ধরে নেওয়া হচ্ছে যে আপনি বহুভুজ পেয়েছেন যা আপনি একটি মঞ্চ টেবিল থেকে অনুলিপি করছেন (যদি আপনি মিশ্রিত হন তবে আপনি জ্যামিতির ক্ষেত্রে টাইপ সেট করতে পারেন যেমন জ্যামিতি (জ্যামিতি, 3857):

CREATE TABLE poi(gid serial primary key, 
   geom_native geometry(POLYGON),  
   geom_mercator geometry(POLYGON,3857) );

INSERT INTO TABLE poi(geom_native, geom_mercator)
SELECT geom, ST_Transform(geom, 3857)
   FROM staging.imported_poly;

আপনার উত্তরের জন্য ধন্যবাদ. ইতিমধ্যে বিদ্যমান টেবিলগুলিতে এটি করার কোনও উপায় আছে (অর্থাত্ স্টেজিং টেবিলগুলি ব্যবহার না করে)? ধরা যাক আমার কাছে একটি geomকলাম সহ ইতিমধ্যে একটি টেবিল রয়েছে এবং আমি কেবল অন্য the_geom_webmercatorকলামটি যুক্ত করতে চাই । আমি যে কিভাবে করতে হবে?
নটোল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.