Thay đổi loại hình học từ Điểm sang Đa điểm trong bảng hiện có trong PostGIS?


31

Có một hàm PostGIS có thể thay đổi loại hình học cho một bảng hiện có không?

Chúng ta cần thay đổi từ ĐIỂM sang MULTIPOINT.

Bảng sẽ trống khi chúng ta thay đổi loại hình học và chúng ta không thể thả / tạo bảng.

Câu trả lời:


62

Đối với PostGIS 2.x , bạn có thể sử dụng ALTER TABLE DDL bằng biểu thức .

Để chuyển đổi từ hình học một phần sang hình học nhiều phần, hãy sử dụng ST_Multi :

ALTER TABLE my_table
    ALTER COLUMN geom TYPE geometry(MultiPoint,4326) USING ST_Multi(geom);

Để chuyển đổi từ đa phần thành hình học một phần, sẽ khó hơn một chút vì bạn chỉ có thể sử dụng một phần và bỏ qua tất cả các phần khác (nếu chúng tồn tại). Kiểm tra dữ liệu của bạn trước để xem bạn có một số hình học có nhiều hơn một phần không:

SELECT COUNT(CASE WHEN ST_NumGeometries(geom) > 1 THEN 1 END) AS multi_geom,
       COUNT(geom) AS total_geom
FROM my_table;

Nếu bạn thấy multi_geomlớn hơn 0, thì bạn sẽ có nguy cơ mất dữ liệu và có lẽ bạn nên giữ nó dưới dạng hình học đa phần. Nếu bạn thấy 0, thì có thể an toàn khi chuyển thành hình dạng một phần với:

ALTER TABLE my_table
    ALTER COLUMN geom TYPE geometry(Point,4326) USING ST_GeometryN(geom, 1);

Đối với PostGIS 1.x , nó hơi lộn xộn hơn, vì có một số bước (cảm ơn @ rec.thegeom!).

Giả sử một bảng my_tablevà cột hình học geom, đây là các bước để chuyển đổi thành đa phần:

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

Xin chào @Mike Toews (và Ulrik). Tôi không nghĩ bước thứ hai của bạn cho PostGIS 1.x là cần thiết trong trường hợp này, Mike. Ulrik cho biết bảng sẽ trống vào thời điểm chuyển đổi loại, do đó sẽ không có bất kỳ giá trị không đa nào gây ra lỗi với một cái gì đó như: 1) ALTER TABLE my_table DROP CONSTRAINT execce_geotype_the_geom; 2) ALTER TABLE my_table ADD CONSTRAINT execce_geotype_the_geom CHECK (hình học (the_geom) = 'MULTIPOINT' :: text OR the_geom IS NULL); sau đó 3) CẬP NHẬT hình học_columns SET type = 'MULTIPOINT' WHERE f_table_name = 'my_table'; (có lẽ là bình luận nhỏ nhất từ ​​trước đến nay - xấu của tôi)
rec.thegeom

@ rec.thegeom đúng; với một bảng trống sẽ không có gì để cập nhật. Cảm ơn đã đăng các lệnh thực tế!
Mike T

Nếu bạn có dữ liệu phức tạp ở nhiều dạng khác nhau GEOMETRYCOLLECTION (MULTIPOLYGON(...))thì bạn có thể muốn thay đổi truy vấn để phát hiện nhiều hơn một hình học. Với kiểm tra like ST_NumGeometries(ST_CollectionHomogenize(geom)) > 1và sử dụng điều tương tự cho USINGvới: ST_GeometryN(ST_Multi(ST_CollectionHomogenize (geom)), 1)hoặc tương tự.
Ravbaker

4

Thay đổi, tôi không nghĩ vậy. Nhưng bạn có thể tạo một bảng mới có cấu trúc giống hệt nhau, ngoại trừ cột geom, sau đó chạy:

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;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.