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ó 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:
Đố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_geom
lớ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_table
và 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';
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)) > 1
và sử dụng điều tương tự cho USING
với: ST_GeometryN(ST_Multi(ST_CollectionHomogenize (geom)), 1)
hoặc tương tự.
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;