การเปลี่ยนประเภทรูปทรงเรขาคณิตจาก Point to Multipoint ภายในตารางที่มีอยู่ใน PostGIS?


31

มีฟังก์ชั่น PostGIS ที่สามารถเปลี่ยนประเภทรูปทรงเรขาคณิตสำหรับตารางที่มีอยู่ได้หรือไม่?

เราต้องเปลี่ยนจาก POINT เป็น MULTIPOINT

ตารางจะว่างเปล่าเมื่อเราเปลี่ยนประเภทรูปทรงเรขาคณิตและเราไม่สามารถปล่อย / สร้างตารางได้

คำตอบ:


62

สำหรับ PostGIS 2.x , คุณสามารถใช้เปลี่ยนแปลงตาราง 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';

สวัสดี @Mike Toews (และ Ulrik) ฉันไม่คิดว่าขั้นตอนที่สองของคุณสำหรับ PostGIS 1.x เป็นสิ่งจำเป็นในกรณีนี้ไมค์ Ulrik กล่าวว่าตารางจะว่างเปล่าในขณะที่มีการแปลงประเภทดังนั้นจะไม่มีค่าที่ไม่ใช่หลายค่าที่จะทำให้เกิดข้อผิดพลาดกับสิ่งที่ชอบ: 1) แก้ไขตาราง my_table DROP CONSTRAINT enforce_geotype_the_geom; 2) แก้ไขตาราง my_table เพิ่มขีด จำกัด enforce_geotype_the_geom ตรวจสอบ (รูปทรงเรขาคณิต (the_geom) = 'MULTIPOINT' :: ข้อความหรือ the_geom is NULL); จากนั้น 3) อัปเดต geometry_columns SET type = 'MULTIPOINT' WHERE f_table_name = 'my_table'; (อาจเป็นความคิดเห็นที่เลวร้ายที่สุด - แย่ที่สุด)
rec.thegeom

@ rec.thegeom ถูกต้อง; ด้วยตารางว่างจะไม่มีอะไรให้อัพเดท ขอบคุณสำหรับการโพสต์คำสั่งจริง!
Mike T

หากคุณมีข้อมูลที่ซับซ้อนในรูปแบบต่าง ๆ เช่นGEOMETRYCOLLECTION (MULTIPOLYGON(...))นั้นคุณอาจต้องการเปลี่ยนแบบสอบถามสำหรับการตรวจจับเรขาคณิตมากกว่าหนึ่ง ด้วยชอบตรวจสอบST_NumGeometries(ST_CollectionHomogenize(geom)) > 1และใช้สิ่งที่คล้ายกันสำหรับUSINGด้วย: ST_GeometryN(ST_Multi(ST_CollectionHomogenize (geom)), 1)หรือคล้ายกัน
Ravbaker

4

เปลี่ยนฉันไม่คิดอย่างนั้น แต่คุณสามารถสร้างตารางใหม่ที่มีโครงสร้างเหมือนกันยกเว้นคอลัมน์ geom จากนั้นเรียกใช้:

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.