กำลังเพิ่มคอลัมน์รูปทรงเรขาคณิตเพิ่มเติมใน PostGIS?


10

ผมนำเข้าหลายชุดข้อมูลภูมิศาสตร์เข้า PostGIS และพวกเขามีความแตกต่างกันSRIDของ (บางคนมีEPSG:3857บางEPSG:4326อย่างบางอย่างอื่น)

ฉันต้องการสร้างเพิ่มเติมgeometry columnเช่น the_geom_mercatorด้วยSRID EPSG:3857และยังคงgeomคอลัมน์เดิมในสิ่งที่SRIDมันเข้ามา

ฉันจะใช้ฟังก์ชัน PostGIS ได้อย่างไร

คำตอบ:


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 ...ไม่จำเป็น แต่จะเปลี่ยนความพยายามด้วยการคาดการณ์ที่ไม่รู้จักหรือไม่ถูกต้องซึ่งจะทำให้เกิดข้อผิดพลาด)

และหากต้องการรักษาตารางนี้ (เพิ่ม / ปรับปรุง) คุณสามารถใช้ฟังก์ชันทริกเกอร์เพื่ออัปเดต the_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_Transform ควรดักข้อผิดพลาดและแสดงคำเตือนเช่น:

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

ขอบคุณสำหรับคำตอบที่ดี มันเป็นระเบียบเรียบร้อยจริง ๆ ที่ใช้ทริกเกอร์ฉันจะเริ่มทำ ฉันสามารถเพิ่มทริกเกอร์นั้นในฐานข้อมูลแทนได้หรือไม่ดังนั้นฉันไม่จำเป็นต้องเพิ่มทริกเกอร์นี้สำหรับทุกตารางใหม่
Knutole

ฉันเพิ่มข้อมูลไปยัง PostGIS ด้วยและโต๊ะถูกสร้างขึ้นเมื่อประปาผ่านshp2psql psqlดังนั้นฉันจึงไม่สามารถเพิ่มทริกเกอร์ก่อนที่จะมีตาราง?
Knutole

1
หากคุณใช้ shp2pgsql ให้ใช้คำสั่ง update ดูด้านบน ทริกเกอร์มีประโยชน์หากคุณต้องการบำรุงรักษาตาราง แต่ไม่ใช่สำหรับการโหลด
Mike T

2

ขั้นแรกให้สร้างตารางที่ไม่ใช่เชิงพื้นที่ตามปกติซึ่งคุณมีอยู่แล้ว ขั้นที่สองเพิ่มคอลัมน์เชิงพื้นที่ลงในตารางโดยใช้ฟังก์ชัน OpenGIS "AddGeometryColumn"

ตัวอย่าง:

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

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

1

คุณสามารถสร้างคอลัมน์รูปทรงเรขาคณิต SRID ที่ไม่มีข้อ จำกัด เพื่อเก็บรูปแบบดั้งเดิมและเปลี่ยนเป็นรูปแบบที่มีอยู่แล้ว นี่คือตัวอย่างที่สมมติว่าสมมติว่าคุณมีรูปหลายเหลี่ยมที่คุณกำลังคัดลอกจากตารางการแสดงละคร (ถ้าคุณผสมคุณสามารถตั้งค่าประเภทเป็นเรขาคณิตเช่นเรขาคณิต (เรขาคณิต, 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คอลัมน์หนึ่ง ฉันจะทำอย่างไร
Knutole
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.